DataFrame连接中的歧义列-无法别名或调用



从SQL后台进入数据库,并使用一些数据框架样本进行基本转换,我在隔离正确的数据框架方面遇到了问题。列用于连接后的其他转换。

对于DF1,我有3列:user_id, user_ts, email。对于DF2,我有两个列:email,已转换。

下面是连接的逻辑。这工作并返回5列;但是,模式

中有两个电子邮件列。
df3 = (df1
.join(df2, df1.email == df2.email, "outer")
)

我试图在df2电子邮件上做一些基本的转换,作为数据帧字符串的一部分,但我收到错误:

无法解析列名"df2.email"Among (user_id, user_ts, email, email, convert)">

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

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

我如何定义我想要在哪个列上做转换,如果它与第二列具有相同的列名。在SQL中,我只是为列使用表别名谓词,但这似乎不是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|
+----+----+-------------+-------------+ '''

相关内容

  • 没有找到相关文章

最新更新