概要
- PySparkのDataFrameではjoinした際にorderは維持されない
- 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|
+-------+---+
参考
- Shuffle operations
- join spark dataframes rows order