現在、RDDの動作を理解しようとしています。たとえば、あるRDDオブジェクトのコンテキストに基づいて行を数えたいとします。私は次のように見ている、いくつかのデータフレームとのexperinceと例の列A
、B
、おそらくいくつかの他の列をするために持っているDFのための私のコードを、持っている:は、rddの行を行のコンテキストに応じて数えます。pyspark
df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()
このコードの論理的な部分は、私にとって明確である - 私はgroupBy
DFの列名に対する操作。 RDDではタプルや行オブジェクトのような列名はありません...どのように類似のタプルを数え、それを整数として固有の行に追加できますか?例えば、私の最初のコードは次のとおりです。私はマップの操作を行うとキーA
とB
からの値のタプルを作成
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)
実際に 'groupBy'は、パーティションをシャッフルする必要があるため、すべてのノード間で多くのデータを移動するため、お勧めしません。 –
@Alberto Bonsanto、このトピックに興味をお持ちいただきありがとうございます。私はそのグループがDFのために危険であるとは思わないし、RDDのためにそれは存在しない。 – Guforu
さて、あなたは* databricks *によって説明されたいくつかの理由を見つけることができます[reduceByKey over groupByKeyを推奨](https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html) –