PySpark数据帧:在自联接后使用重复的列名

问题描述 投票:1回答:1

我有一个像这样的数据框(灵感来自this问题,设置略有不同):

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.6spark 2.3上运行它

pyspark pyspark-sql
1个回答
2
投票

如果存在重复的列名称,请在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)]
© www.soinside.com 2019 - 2024. All rights reserved.