山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

PySparkではDataFrameのjoinでorderは維持されない

概要

  • PySparkのDataFrameではjoinした際にorderは維持されない
    • 正確にはshuffleが行われる
  • orderは出力直前に行うのが鉄則

再現コード

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df1 = spark.createDataFrame(
    [
        ['user_01'],
        ['user_02'],
        ['user_03'],
        ['user_04'],
        ['user_05'],
    ],
    ['id'],
)
df2 = spark.createDataFrame(
    [
        ['user_01', '1'],
        ['user_02', '2'],
        ['user_03', '3'],
        ['user_04', '4'],
        ['user_05', '5'],
    ],
    ['id', 'c1']
)
print('order byされているdf1')
df1 = df1.orderBy('id')
df1.show()

print('order byされているdf2')
df2 = df2.orderBy('id')
df2.show()

print('join後')
df1.join(df2, 'id').show()
order byされているdf1
+-------+
|     id|
+-------+
|user_01|
|user_02|
|user_03|
|user_04|
|user_05|
+-------+

order byされているdf2
+-------+---+
|     id| c1|
+-------+---+
|user_01|  1|
|user_02|  2|
|user_03|  3|
|user_04|  4|
|user_05|  5|
+-------+---+

join後
+-------+---+
|     id| c1|
+-------+---+
|user_03|  3|
|user_02|  2|
|user_01|  1|
|user_04|  4|
|user_05|  5|
+-------+---+

参考