2016-03-20 5 views
1

次の質問は、PySparkのバージョン1.5.0に固有のものです。新しい機能がPySparkに絶えず追加されているためです。PySpark 1.5.0では、列 `x`の値に基づいて` y`列のすべての項目をリストする方法はありますか?

xの値に基づいて、列yのすべての項目を一覧表示するにはどうすればよいですか?たとえば :

+---+--------+ 
| x| y  | 
+---+--------+ 
|foo| [1, 1] | 
|bar| [10, 2]| 
|bar| [999] | 
+---+--------+ 

順番は関係ありません:

rdd = sc.parallelize([ {'x': "foo", 'y': 1}, 
        {'x': "foo", 'y': 1}, 
        {'x': "bar", 'y': 10}, 
       {'x': "bar", 'y': 2}, 
       {'x': 'qux', 'y':999}]) 
df = sqlCtx.createDataFrame(rdd) 
df.show() 

+---+---+ 
| x| y| 
+---+---+ 
|foo| 1| 
|foo| 1| 
|bar| 10| 
|bar| 2| 
|qux|999| 
+---+---+ 

私のようなものを持っていると思います。

pd = df.toPandas() 
pd.groupby('x')['y'].apply(list).reset_index() 

しかし、版1.5.0でgroupBy集約機能は非常に限られているようだ:パンダでは、私はこのusign GROUPBYを達成することができます。どのようにこの制限を克服するか考えていますか?

答えて

4

あなたはcollect_listハイブUDAF使用することができます。

from pyspark.sql.functions import expr 
from pyspark import HiveContext 

sqlContext = HiveContext(sc) 
df = sqlContext.createDataFrame(rdd) 

df.groupBy("x").agg(expr("collect_list(y) AS y")) 
1.6では

以降あなたはcollect_list機能を使用することができます

from pyspark.sql.functions import collect_list 

df.groupBy("x").agg(collect_list(y).alias("y")) 

を2.0以降にあなたがハイブのサポートなしでそれを使用することができます。

これは特に効率的な操作ではありませんが、適度に使用する必要があります。

また、スキーマの推論に辞書を使用しないでください。本当に有益な答えは1.2

+0

+1ですが、私の目的ではOPは1.5で、collect_listは1.6で新しく追加されました。http://spark.apache.org/docs/latest/api /python/pyspark.sql.html?highlight=dataframe#pyspark.sql.functions.collect_list – Paul

+0

誰かが 'group_by' +' collect_list'を 'rdd.groupBy'と比較して効率、ロバストネスなどを見てきましたか? – Paul

+1

@Paul 'collect_list'はHive UDAFで、ネイティブのSpark操作ではありません。 1.6.0では 'DataFrame' APIラッパーが導入されました。そのため、 'expr'(またはSQLクエリ)を介してここで使用する必要があります。 – zero323

関連する問題