如何将列表传递给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?

将 RDD 的值作为变量传递给另一个 RDD - Spark #Pyspark [重复]

如何将视图中的 javascript 代码中的对象列表传递给控制器​​中的操作方法