2016-03-28 8 views
0

現在、RDDの動作を理解しようとしています。たとえば、あるRDDオブジェクトのコンテキストに基づいて行を数えたいとします。私は次のように見ている、いくつかのデータフレームとのexperinceと例の列AB、おそらくいくつかの他の列をするために持っているDFのための私のコードを、持っている:は、rddの行を行のコンテキストに応じて数えます。pyspark

df = sqlContext.read.json("filepath") 
df2 = df.groupBy(['A', 'B']).count() 

このコードの論理的な部分は、私にとって明確である - 私はgroupBy DFの列名に対する操作。 RDDではタプルや行オブジェクトのような列名はありません...どのように類似のタプルを数え、それを整数として固有の行に追加できますか?例えば、私の最初のコードは次のとおりです。私はマップの操作を行うとキーABからの値のタプルを作成

df = sqlContext.read.json("filepath") 
rddob = df.rdd.map(lambda line:(line.A, line.B)) 

。ユニークな行にはキーがもうありません(これは列名を持つDataFrameとの最も重要な違いです)。 これで何かを作ることができますが、RDDの行数だけを計算します。

rddcalc = rddob.distinct().count() 

私は私の出力のために何をしたいです、ちょうど次のとおりです。

((a1, b1), 2) 
((a2, b2), 3) 
((a2, b3), 1) 
... 

PS

私はこの質問に対する私の個人的な解決策を発見しました。ここでは、rddは初期のrdd、rddlistはすべての行のリスト、rddmodは最終的に変更されたrddであり、その結果としての解です。

rddlist = rdd.map(lambda line:(line.A, line.B)).map(lambda line: (line, 1)).countByKey().items() 
rddmod = sc.parallelize(rddlist) 
+0

実際に 'groupBy'は、パーティションをシャッフルする必要があるため、すべてのノード間で多くのデータを移動するため、お勧めしません。 –

+0

@Alberto Bonsanto、このトピックに興味をお持ちいただきありがとうございます。私はそのグループがDFのために危険であるとは思わないし、RDDのためにそれは存在しない。 – Guforu

+0

さて、あなたは* databricks *によって説明されたいくつかの理由を見つけることができます[reduceByKey over groupByKeyを推奨](https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html) –

答えて

1

あなたが探しているものはreduceByKeyです。これにより、(a,b)行の異なるペアが何回表示されるかがカウントされます。 それは次のようになります。

rddob = df.rdd.map(lambda line: (line.A + line.B, 1)) 
counts_by_key = rddob.reduceByKey(lambda a,b: a+b) 

をあなたは今、キー、フォームの値のペアを持つことになります。 ((a,b), count-of-times-pair-appears)

AとBが文字列である場合にのみ動作することに注意してください。それらがリストである場合、reduceを実行するために、「主キー」タイプのオブジェクトを作成する必要があります。主キーが複雑なオブジェクトの場合は、reduceByKeyを実行することはできません。

+0

お返事ありがとうございます。実際に私はすでに解決策を見つけましたが、ここで公開しませんでした。あなたはほぼ正しいです、私は(AとBの値のユニークな組み合わせとしてキーを作成しましたが、最終的な関数としてcountByKeyを使用しました)ありがとうございました – Guforu

+0

あなたのソリューションをパブリッシュして、 – PinoSan

+0

@PinoSan、ok、私は最初の投稿 – Guforu

関連する問題