如何将列表传递给pyspark中的selectExpr方法?
Posted
技术标签:
【中文标题】如何将列表传递给pyspark中的selectExpr方法?【英文标题】:How to pass list to the selectExpr method in pyspark? 【发布时间】:2021-12-01 11:12:07 【问题描述】:问题看似简单,却找不到简单的解决方法。
我正在尝试在selectExpr
中动态创建新列,但它不接受列表作为参数。实现它的最佳方法是什么? (多个withColumn
不是一个选项,因为***exception
输入:
a | b
-------
1 | zzz
2 | xxx
试过这样的
sample_new_cols = "s":"ran-s",
"ts": "current_timestamp()",
df = df.selectExpr('*',
[
f"definition as name"
for name, definition in sample_new_cols.items()
]
)
它的输出是
a | b | s | ts
------------|-----------
1 |zzz|ran-s|2021-12-01 08:10:21
2 |xxx|ran-s|2021-12-01 08:10:21
【问题讨论】:
【参考方案1】:你几乎明白了:
对于字符串静态列定义,您需要引用值(例如'ran-s'
)
在selectExpr
中,您需要在列数组之前使用星号*
sample_new_cols =
"s": "'ran-s'",
"ts": "current_timestamp()",
df1 = df.selectExpr('*', *[
f"definition as name"
for name, definition in sample_new_cols.items()
])
df1.show()
#+---+---+-----+-----------------------+
#|a |b |s |ts |
#+---+---+-----+-----------------------+
#|1 |zzz|ran-s|2021-12-01 14:23:14.779|
#|2 |xxx|ran-s|2021-12-01 14:23:14.779|
#+---+---+-----+-----------------------+
【讨论】:
哈,谢谢@blackbishop。我在发布的几分钟内将其整理出来,然后完全忘记了我在这里问过的问题。以上是关于如何将列表传递给pyspark中的selectExpr方法?的主要内容,如果未能解决你的问题,请参考以下文章
无法将变量传递给 pyspark 中的 spark sql 查询
更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark
传递列表项作为 withColumn (Pyspark) 的输入
Pyspark 和使用 UDF:如何将 Python 参数(sys.argv、argparse)传递给 Python Worker?