DataFrame 连接中的不明确列 - 无法别名或调用

Posted

技术标签:

【中文标题】DataFrame 连接中的不明确列 - 无法别名或调用【英文标题】:Ambiguous Column in DataFrame Join - Unable to Alias or Call 【发布时间】:2021-08-30 15:54:57 【问题描述】:

从 SQL 后台进入 databricks 并使用一些数据帧示例来连接以进行基本转换,但我在为连接后的其他转换隔离正确的 dataframe.column 时遇到问题。

对于 DF1,我有 3 列:user_id、user_ts、email。对于 DF2,我有两列:电子邮件,已转换。

以下是我的加入逻辑。这有效并返回 5 列;但是,架构中有两个电子邮件列

df3 = (df1
       .join(df2, df1.email == df2.email, "outer")
     )

我正在尝试对 df2 电子邮件进行一些基本转换,作为数据框字符串的一部分,但我收到错误:

“无法解析(user_id、user_ts、email、email、converted)中的列名“df2.email””

df3 = (df1
       .join(df2, df1.email == df2.email, "outer")
       .na.fill(False,["df2.email"])
     )

如果我从 fill() 中删除 df2,则会收到列不明确的错误。

如果与第二列具有相同的列名,我如何定义要对其进行转换的列。在 SQL 中,我只是对列使用表别名谓词,但这似乎不是 pyspark 的最佳使用方式。

建议?

【问题讨论】:

【参考方案1】:

如果您想避免连接结果中的两个键列并获得组合结果,则可以将键列列表作为参数传递给join() 方法。

如果您想从两个数据帧中保留相同的键列,那么您必须在进行转换之前重命名其中一个列名,否则 spark 会抛出不明确的列错误。

df1 = spark.createDataFrame([(1, 'abc@gmail.com'),(2,'def@gmail.com')],["id1", "email"])
df2 = spark.createDataFrame([(1, 'abc@gmail.com'),(2,'ghi@gmail.com')],["id2", "email"])
df1.join(df2,['email'], 'outer').show()
'''
+-------------+----+----+
|        email| id1| id2|
+-------------+----+----+
|def@gmail.com|   2|null|
|ghi@gmail.com|null|   2|
|abc@gmail.com|   1|   1|
+-------------+----+----+'''

df1.join(df2,df1['email'] == df2['email'], 'outer').show()
'''
+----+-------------+----+-------------+
| id1|        email| id2|        email|
+----+-------------+----+-------------+
|   2|def@gmail.com|null|         null|
|null|         null|   2|ghi@gmail.com|
|   1|abc@gmail.com|   1|abc@gmail.com|
+----+-------------+----+-------------+'''

df1.join(df2,df1['email'] == df2['email'], 'outer') \
.select('id1', 'id2', df1['email'], df2['email'].alias('email2')) \
.na.fill('False','email2').show()
'''
+----+----+-------------+-------------+
| id1| id2|        email|       email2|
+----+----+-------------+-------------+
|   2|null|def@gmail.com|        False|
|null|   2|         null|ghi@gmail.com|
|   1|   1|abc@gmail.com|abc@gmail.com|
+----+----+-------------+-------------+ '''

【讨论】:

感谢您的澄清,Mohana。您的示例使用选择字段为特定列设置别名效果很好。作为 join() 调用的一部分,我还能够为 df2 使用 withColumnRenamed ..

以上是关于DataFrame 连接中的不明确列 - 无法别名或调用的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918

左外连接代码的不明确列名

通过针对 DataFrame 中某个列的不存在的特殊值来生成合成数据样本

如何将一个 DataFrame 中的多个列与另一个 DataFrame 连接

Python 与 DataFrame 聚合合并 ...error: '' 既是索引级别又是列标签,这是不明确的

DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]