DataFrame 连接中的歧义列 - 无法别名或调用
Ambiguous Column in DataFrame Join - Unable to Alias or Call
从 SQL 背景进入 databricks 并使用一些数据帧样本进行基本转换,我在连接后为其他转换隔离正确的 dataframe.column 时遇到问题。
对于 DF1,我有 3 列:user_id、user_ts、电子邮件。对于 DF2,我有两列:电子邮件,已转换。
下面是我的加入逻辑。这有效 returns 5 列;但是,架构中有两个电子邮件列
df3 = (df1
.join(df2, df1.email == df2.email, "outer")
)
我正在尝试对 df2 电子邮件作为数据帧字符串的一部分进行一些基本转换,但我收到错误:
“无法在(user_id、user_ts、电子邮件、电子邮件、已转换)中解析列名称“df2.email”
df3 = (df1
.join(df2, df1.email == df2.email, "outer")
.na.fill(False,["df2.email"])
)
如果我从 fill() 中删除 df2,我会收到列不明确的错误。
如果它与第二列具有相同的列名,我如何定义要对其进行转换的列。在 SQL 中,我只是为该列使用了 table 别名谓词,但这似乎不是 pyspark 的最佳使用方式。
建议?
如果您想避免连接结果中的两个键列并获得组合结果,那么您可以将键列列表作为参数传递给 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|
+----+----+-------------+-------------+ '''
从 SQL 背景进入 databricks 并使用一些数据帧样本进行基本转换,我在连接后为其他转换隔离正确的 dataframe.column 时遇到问题。
对于 DF1,我有 3 列:user_id、user_ts、电子邮件。对于 DF2,我有两列:电子邮件,已转换。
下面是我的加入逻辑。这有效 returns 5 列;但是,架构中有两个电子邮件列
df3 = (df1
.join(df2, df1.email == df2.email, "outer")
)
我正在尝试对 df2 电子邮件作为数据帧字符串的一部分进行一些基本转换,但我收到错误:
“无法在(user_id、user_ts、电子邮件、电子邮件、已转换)中解析列名称“df2.email”
df3 = (df1
.join(df2, df1.email == df2.email, "outer")
.na.fill(False,["df2.email"])
)
如果我从 fill() 中删除 df2,我会收到列不明确的错误。
如果它与第二列具有相同的列名,我如何定义要对其进行转换的列。在 SQL 中,我只是为该列使用了 table 别名谓词,但这似乎不是 pyspark 的最佳使用方式。
建议?
如果您想避免连接结果中的两个键列并获得组合结果,那么您可以将键列列表作为参数传递给 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|
+----+----+-------------+-------------+ '''