条件の後に起こることができ、時間のかかる操作(再パーティショニングまたは再場所)の面で何が起こる
のみとなりますdf_1とdf_2が "some_col"と同じ値を持つパーティションを持つ場合、つまり、df_1に2つのパーティションがある場合:[(1,2)]、[(3,1)、(3,7)](some_colの値は1、3)なら、df_2はsome_col値1,3を持つパーティションを持つ必要があります。その場合、df_1とdf_2を結合すると、df_1またはdf_2と同じ数のパーティションでdf_3が生成されます。
それ以外の場合は、デフォルトの200個のパーティションを作成し、結合操作全体をシャッフルしようとします。明確にするため
次の例で試すことができます。
rdd1 = sc.parallelize([(1,2), (1,9), (2, 3), (3,4)])
df1 = rdd1.toDF(['a', 'b'])
df1 = df1.repartition(3, 'a')
df1.rdd.glom().collect() #outputs like:
>> [[Row(a=2,b=3)], [Row(a=3,b=4)], [Row(a=1,b=2), Row(a=1,b=9)]]
df1.rdd.getNumPartitions()
>>3
rdd2 = sc.parallelize([(1,21), (1,91), (2, 31), (3,41)])
df2 = rdd2.toDF(['a', 'b'])
df2 = df2.repartition(3, 'a')
df2.rdd.glom().collect() #outputs like:
>> [[Row(a=2,b=31)], [Row(a=3,b=41)], [Row(a=1,b=21), Row(a=1,b=91)]]
df2.rdd.getNumPartitions()
>>3
df3 = df1.join(df2, on='a')
df3.rdd.glom().collect() #outputs like:
>> [[Row(a=2,b=3,b=31)], [Row(a=3,b=4,b=41)], [Row(a=1,b=2,b=21), Row(a=1,b=9,b=91)]]
df21.rdd.getNumPartitions()
>>3
をなぜあなたは 'df_3'は50個のパーティションを持つべきだと思いますか? joinの直後に 'df_3.rdd.getNumPartitions()'と書かれているものは何ですか? – Mariusz
'df_3.rdd.getNumPartitions()'が 'spark.default.parallelism'と等しいことがわかりました。それは奇妙に見えます..なぜそれは起こるのですか?同じパーティション内で結合する方がはるかに簡単です! – AlexanderLedovsky
これは常に 'spark.sql.shuffle.partitions'と同じです。詳しくはこちらをご覧ください:https://stackoverflow.com/questions/41359344/why-is-the-number-of-partitions-after-groupby-200 -why-is-this-200-not-some-othe – Mariusz