在PySpark中,col()函数在使用和不使用dataframe别名时的行为不同

rjee0c15  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(178)

举个例子。
如果我使用以下命令创建员工-经理 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 引用?

pvabu6sv

pvabu6sv1#

在列表达式(如col("emp1.manager_id"))中引用 Dataframe (即在 Dataframe 上使用alias)通常不仅是最佳实践建议,而且在我们

  • 执行自联接;
  • 连接具有同名列的 Dataframe 。

如果在这种情况下不使用 Dataframe 别名并尝试引用列,则会收到 “AnalysisException:引用'col_name'不明确..."
否则,您可以放心地不使用这种表示法,因为它可能会在没有充分理由的情况下使您的代码过于混乱。

相关问题