У меня есть такой фрейм данных (вдохновленный этим вопросом с немного другой настройкой):
df3 = hive_context.createDataFrame([
Row(a=107831, f=3),
Row(a=107531, f=2),
Row(a=125231, f=2)
])
На основании этого я создаю два новых объекта. Каждый является подмножеством исходного кадра данных:
from pyspark.sql.functions import col
df1 = (df3
.filter(((col('a') == 107831) & (col('f') == 3))|
((col('a') == 125231) & (col('f') == 2))))
df2 = (df3
.filter(((col('a') == 107831) & (col('f') == 3))|
((col('a') == 107531) & (col('f') == 2))))
Затем я хотел бы объединить эти два набора данных и получить столбцы f
из каждого из них, как в:
a = (df1
.join(df2, (df1['a'] == df2['a']), how = 'full')
.select(df1['f'], df2['f']).collect())
Однако я получаю [Row(f=None, f=None), Row(f=2, f=2), Row(f=3, f=3)]
Вместо желаемого [Row(f=3, f=4), Row(f=None, f=2), Row(f=2, f=None)]
или в виде таблицы:
+------+----+------+----+
| a| f| a| f|
+------+----+------+----+
|107831| 3|107831| 4|
| null|null|107531| 2|
|125231| 2| null|null|
+------+----+------+----+
Кто-нибудь знает, как решить эту проблему? Нужно ли хранить где-нибудь df1 и df2?
Когда я запускаю сценарий, как в приведенном выше связанном вопросе, я получаю ожидаемые результаты:
df1 = hive_context.createDataFrame([
Row(a=107831, f=3),
Row(a=125231, f=2),
])
df2 = hive_context.createDataFrame([
Row(a=107831, f=4),
Row(a=107531, f=2),
])
a = df1.join(df2, (df1['a'] == df2['a']), how = 'full').select(df1['f'], df2['f']).collect()
a
Я запускаю его на python 3.6
и spark 2.3