举个例子。
如果我使用以下命令创建员工-经理 Dataframe :
df1 = spark.createDataFrame(
data=[(1, "Robert", 2), (2, "Ria", 3), (3, "James", 5)],
schema="empId int, empname string, manager_id int",
)
然后通过将此表别名化为两个不同的名称,在经理ID和雇员ID上创建一个自连接,如下所示:
join_df = (
df1.alias("emp1")
.join(df1.alias("emp2"), col("emp1.manager_id") == col("emp2.empId"), "inner")
.select(
col("emp1.empId"),
col("emp1.empname").alias("employee"),
col("emp2.empname").alias("manager_name"),
col("emp2.manager_id"),
)
)
我需要使用col("emp1.manager_id") == col("emp2.empId")
作为连接条件。请注意,我们在列函数中引用了列为“manager_id”的 Dataframe “emp 1”。在这种情况下,此语句可以正常工作。
但通常col()
只接受列名,而不接受 Dataframe 引用。
如果我在不使用别名的 Dataframe 上使用此逻辑,它将抛出一个错误:
找不到“emp1.manager_id”,您是指“经理id”吗?~
出版日期:
我想知道,什么时候在col()
函数中提供 Dataframe 引用是正常的,什么时候不应该提供 Dataframe 引用?
1条答案
按热度按时间pvabu6sv1#
在列表达式(如
col("emp1.manager_id")
)中引用 Dataframe (即在 Dataframe 上使用alias
)通常不仅是最佳实践建议,而且在我们如果在这种情况下不使用 Dataframe 别名并尝试引用列,则会收到 “AnalysisException:引用'col_name'不明确..."
否则,您可以放心地不使用这种表示法,因为它可能会在没有充分理由的情况下使您的代码过于混乱。