2016-05-21 70 views
0

spark中的新手,並且在數據幀上有關於map函數的問題。我有一個火花SQL數據框,名爲df,假設它是這樣的:通過pyspark中的map函數統計sql中的數據幀的數量

temp = sqlContext.sql("SELECT * FROM df WHERE tag = 'A00000000001'") 
temp.show(1) 

則有:

+----------+------------+------+ 
|  time|   tag| value| 
+----------+------------+------+ 
|1399766400|A00000000001|1000.0| 
|1399766401|A00000000002|1001.0| 
+----------+------------+------+ 

我可以基於與命令中的變量值選擇其中的一部分

+----------+------------+------+ 
|  time|   tag| value| 
+----------+------------+------+ 
|1399766400|A00000000001|1000.0| 
+----------+------------+------+ 

目前,我有一個列表

x = ["SELECT * FROM df WHERE tag = 'A00000000001'", "SELECT * FROM df WHERE tag = 'A00000000002'"] 

已被存儲爲RDD變量,我想申請就可以了map函數來計算選擇的依據他們數據框的次數,我試過的功能等:

y = x.map(lambda x: sqlContext.sql(x).count()) 
y.take(2) 

我假定返回值應該是[1, 1],但它給人的錯誤:

TypeError: 'JavaPackage' object is not callable 

是否有可能與此方法的數據幀執行地圖功能?如果不是,我該怎麼做。

回答

2

如前所述,無法在分佈式數據結構上執行嵌套操作。從更一般的意義上說,Spark不是一個數據庫。 Spark數據結構,包括DataFrames不適用於單個記錄檢索等任務。

如果所有的查詢跟隨在您通過柱使用簡單的過濾器相同的模式,只有一個與並加入簡單聚合的事情:

tags = sc.parallelize([("A00000000001",), ("A00000000002",)]).toDF(["tag"]) 
tags.join(df, ["tag"]).groupBy("tag").count() 
0

這是不可能的。您可以使用列表解析:

>>> xs = ["SELECT * FROM df WHERE tag = 'A00000000001'", "SELECT * FROM df WHERE tag = 'A00000000002'"] 
>>> [sqlContext.sql(x).count() for x in xs] 
+0

所以,如果在RDD變量列表,然後我要首先收集? 「收集」需要很長時間。 –

+0

除非您的RDD受到「少量」元素的約束,否則建議避免收集,因爲它會將所有數據都掌握在掌握之中,並且可能會「給它」帶來OME。我肯定會考慮@ zero323答案作爲一個更清潔的解決方案。 – eliasah