PySpark 数据框:自连接后使用重复的列名
PySpark dataframe: working with duplicated column names after self join
我有一个这样的数据框(灵感来自 问题,设置略有不同):
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)]
或者表示为table:
+------+----+------+----+
| 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
如果列名重复,请在 DataFrame 上使用别名以避免歧义:
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)]
我有一个这样的数据框(灵感来自
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)]
或者表示为table:
+------+----+------+----+
| 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
如果列名重复,请在 DataFrame 上使用别名以避免歧义:
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)]