提问人:krishna kaushik 提问时间:11/12/2023 更新时间:11/12/2023 访问量:28
如何根据两个现有列的值在 psyspark 中创建列?
How do I create a column in psyspark based on the values of two existing columns?
问:
我有一个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功能实现这一点?
我一直在尝试各种方法,但没有成功。任何帮助或指导将不胜感激。谢谢!
答:
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)
评论