如何根据两个现有列的值在 psyspark 中创建列?

How do I create a column in psyspark based on the values of two existing columns?

提问人:krishna kaushik 提问时间:11/12/2023 更新时间:11/12/2023 访问量:28

问:

我有一个Pyspark数据帧,结构如下。

| orderid  |  sub | filter-list                          | 
| -------- | ---- |          --------                    |
| 1        | 367  | [['123','supply'],['367','price']]   |
| 2        | 389  | [['389','supply'],['906','supply']]  |
| 3        | 804  | [['173','supply'],['804','price']]   |

在此 DataFrame 中,我的目标是从filter_list列中提取值,其中列表的整数值对应于第二列中的子值。

例如,考虑第一行,第二列的值 367 存在于第 3 列中存在的列表的第 2 个位置,因此我想要的所需值是价格。 同样,在第二行中,sub 的值出现在第 3 列中列表的第 1 个位置。因此,期望的值是供应。

因此,我想要的最终数据帧是

| orderid  |  sub   | filter-list                             |filter-name| 
| -------- | -----  |     --------                            |   ------  |
| 1        | 367    | [['123','supply'],['367','price']]      |price      |   
| 2        | 389    | [['389','supply'],['906','supply']]     |supply     |   
| 3        | 804    | [['173','supply'],['804','price']]      |price      |  

如何通过pyspark功能实现这一点?

我一直在尝试各种方法,但没有成功。任何帮助或指导将不胜感激。谢谢!

python sql pyspark apache-spark-sql

评论

0赞 nbk 11/12/2023
你有没有尝试过什么,我们能展示你的尝试吗

答:

1赞 krishna kaushik 11/12/2023 #1

经过多次尝试,我成功地使用 PySpark 实现了解决方案。

实现这一点的关键是利用 TRANSFORM 函数和 FILTER 函数,使我能够根据需要有效地过滤和转换数据。

下面是根据需要添加新列的代码片段。

# Extract filter-name based on conditions
df = df.withColumn(
    "filter_name",
    expr("TRANSFORM(FILTER(filter_list, f -> f[0] = CAST(sub AS STRING)), f -> f[1])[0]")
)

df.show(truncate=False)