2016-02-05 24 views
2

如何執行不是程序的驅動程序部分的例程的sql查詢?如何從地圖函數(Python)執行spark sql查詢?

from pyspark import SparkContext 
from pyspark.sql import SQLContext 
from pyspark.sql.types import * 


def doWork(rec): 
    data = SQLContext.sql("select * from zip_data where STATEFP ='{sfp}' and COUNTYFP = '{cfp}' ".format(sfp=rec[0], cfp=rec[1])) 
    for item in data.collect(): 
     print(item) 
    # do something 
    return (rec[0], rec[1]) 

if __name__ == "__main__": 
    sc = SparkContext(appName="Some app") 
    print("Starting some app") 

    SQLContext = SQLContext(sc) 

    parquetFile = SQLContext.read.parquet("/path/to/data/") 
    parquetFile.registerTempTable("zip_data") 


    df = SQLContext.sql("select distinct STATEFP,COUNTYFP from zip_data where STATEFP IN ('12') ") 
    rslts = df.map(doWork) 

    for rslt in rslts.collect(): 
     print(rslt) 

在這個例子中,我試圖查詢相同的表,但想查詢的SQL星火註冊過其他表。

回答

4

一個不對分佈式數據結構執行嵌套操作,它在Spark中不受支持。您必須使用joins,本地(可選廣播)數據結構或直接訪問外部數據。

+0

謝謝你的回覆,這是有道理的,我一直忘記分佈式方面。 –

0

在情況下,當你無法與joins完成你的任務,要在內存中運行SQL查詢:

您可以考慮使用像H2, Apache DerbyRedis等一些內存數據庫更快地並行執行SQL查詢,而不會失去內存計算的好處。

MySQL, PostgreSQL等數據庫相比,內存數據庫將提供更快的訪問。