从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|
+----+----+-------------+-------------+ '''