Фрейм данных PySpark: работа с дублированными именами столбцов после самостоятельного объединения - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть такой фрейм данных (вдохновленный этим вопросом с немного другой настройкой):

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

1 Ответ

0 голосов
/ 05 сентября 2018

В случаях, когда есть дублированные имена столбцов, используйте псевдонимы в ваших фреймах данных, чтобы избежать двусмысленности:

a = df1.alias('l').join(df2.alias('r'), on='a', how = 'full').select('l.f', 'r.f').collect()
print(a)
#[Row(f=3, f=3), Row(f=None, f=2), Row(f=2, f=None)]
...