在 Python 数据框连接中动态填充列名

Posted

技术标签:

【中文标题】在 Python 数据框连接中动态填充列名【英文标题】:dynamically populate column name in Python dataframe join 【发布时间】:2018-02-24 00:27:50 【问题描述】:

我正在开发一个动态脚本,它可以join 任何给定的 pyspark 数据帧。问题是文件中的列名会有所不同,并且连接条件的数量可能会有所不同。我可以在循环中处理这个问题,但我使用变量名执行连接失败。

(我的意图是根据文件结构和连接条件动态填充 a 和 b 列或更多列)

b="incrementalFile.Id1"
a="existingFile.Id"
unChangedRecords = existingFile.join(incrementalFile,(a==b),"left") 

Traceback(最近一次调用最后一次):文件“”,第 1 行,在文件中 “/usr/lib/spark/python/pyspark/sql/dataframe.py”,第 818 行,加入 assert isinstance(on[0], Column), "on 应该是 Column 或 Column 列表" AssertionError: on 应该是 Column 或 Column 列表

但如果我不在join 条件中放置任何变量,则相同的代码可以正常工作,如下所示。

unChangedRecords = existingFile.join(
    incrementalFile,
    (existingFile.Id==incrementalFile.Id1), 
    "left")

【问题讨论】:

为什么这个标签是'scala'? @DyZ :原因是,scala 或 pyspark 中的逻辑可以相同 【参考方案1】:

在您的第二个示例中,existingFile.Id 是一个列,而不是一个字符串,但在您的第一个示例中,它是一个字符串。您想使用 pyspark.sql.functions.col 按名称引用列。它的文档没有示例,但在同一页面上的 alias 示例中使用了它。

【讨论】:

你太棒了!那是一个很好的收获。让我尝试接受答案.. 暂时 +1

以上是关于在 Python 数据框连接中动态填充列名的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在java中组合(连接)具有相同列名的两个数据框

动态生成列名时如何获取kendo选择的行值

在 PySpark 中连接两个数据框时避免列重复列名

动态数据框中从字符到日期的列名

如何连接数据框而不丢失列名中的括号?

PySpark:如何将数据框与存储在其他变量中的列名连接起来