2016-07-25 9 views
0

だから基本的に、私が閾値を超えている(いくつかのサービスに加入人口可能)すべての_3を見つけようとしています例以下PySpark:追加のデータフレームなしの結果クエリに基づいてフィルター

>>> l = [("US","City1",125),("US","City2",123),("Europe","CityX",23),("Europe","CityY",17)] 
>>> print l 
[('US', 'City1', 125), ('US', 'City2', 123), ('Europe', 'CityX', 23), ('Europe', 'CityY', 17)] 

>>> sc = SparkContext(appName="N") 
>>> sqlsc = SQLContext(sc) 
>>> df = sqlsc.createDataFrame(l) 
>>> df.printSchema() 
root 
|-- _1: string (nullable = true) 
|-- _2: string (nullable = true) 
|-- _3: long (nullable = true) 
>>> df.registerTempTable("t1") 
>>> rdf=sqlsc.sql("Select _1,sum(_3) from t1 group by _1").show() 
+------+---+ 
| _1|_c1| 
+------+---+ 
| US|248| 
|Europe| 40| 
+------+---+ 
>>> rdf.printSchema() 
root 
|-- _1: string (nullable = true) 
|-- _c1: long (nullable = true) 
>>> rdf.registerTempTable("t2") 
>>> sqlsc.sql("Select * from t2 where _c1 > 200").show() 
+---+---+ 
| _1|_c1| 
+---+---+ 
| US|248| 
+---+---+ 

を考えてみましょうそれぞれの国。上記の表では、追加のデータフレームは、今

rdf

を作成されている、私は rdfデータフレームを排除し、 dfデータフレーム自体の中に完全なクエリを埋め込むにはどうすればよいです。

私がしようとしたが、エラー

>>> sqlsc.sql("Select _1,sum(_3) from t1 group by _1").show() 
+------+---+ 
| _1|_c1| 
+------+---+ 
| US|248| 
|Europe| 40| 
+------+---+ 
>>> sqlsc.sql("Select _1,sum(_3) from t1 group by _1 where _c1 > 200").show() 
Traceback (most recent call last): 
File "/ghostcache/kimanjun/spark-1.6.0/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o28.sql. 
: java.lang.RuntimeException: [1.39] failure: ``union'' expected but `where' found 

答えて

1

ここでは、一時テーブルの無いようなものを持つソリューションですpysparkスロー:

#Do this to don't have conflict with sum in built-in spark functions 
from pyspark.sql import sum as _sum 

gDf = df.groupBy(df._1).agg(_sum(df._3).alias('sum')) 
gDf.filter(gDf.sum > 200).show() 

このソリューション私たちはグループの方法を持っているし、合計で集計。合計に問題がないことを確認します。別のオブジェクトのフィルタよりも優れています。

このlinkは、データフレームで直接SQLを使用するよりもはるかに強力ないくつかの便利な方法を見ることをお勧めします。

関連する問題