使用变量列表值的pyspark数据帧过滤器

2024-06-28 11:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个过滤pyspark数据帧的要求,用户将直接将过滤列部分作为字符串参数传递。例如:

Sample Input data: df_input

|dim1|dim2|  byvar|value1|value2|
| 101| 201|MTD0001|     1|    10|
| 201| 202|MTD0002|     2|    12|
| 301| 302|MTD0003|     3|    13|
| 401| 402|MTD0004|     5|    19|

例1:过滤器

I will filter the data as: df_input = df_input.filter(filter_str)

Output: (**I'm able to get the output**)

|dim1|dim2|  byvar|value1|value2|
| 101| 201|MTD0001|     1|    10|

但是,对于多重过滤条件,我得到了错误,无法过滤。 无法过滤输入数据帧的场景:

有效的Scr 1:

filter_str = "dim1 = '101' and dim2 in '['302', '402']'"
df_inp = df_inp.filter(filter_str)
Getting Error

有效的Scr 2:

value_list = ['302', '402']
filter_str = "dim1 = '101' or dim2 in '(value_list)'"
df_inp = df_inp.filter(filter_str)
Getting Error

如果我得到了示例中提到的filter_str字符串,请您帮助我获取scr 1和scr 2,以及如何修改filter部分


Tags: the数据字符串dfinputdatafilterinp
1条回答
网友
1楼 · 发布于 2024-06-28 11:03:12

过滤器查询中使用&(或|运算符,并用括号^{括住每条语句

df.filter((col("dim1") == '101') | (col("dim2").isin(['302','402']))).show()
#+  +  +   -+   +   +
#|dim1|dim2|  byvar|value1|value2|
#+  +  +   -+   +   +
#| 101| 201|MTD0001|     1|    10|
#| 301| 302|MTD0003|     3|    13|
#| 401| 402|MTD0004|     5|    19|
#+  +  +   -+   +   +

df.filter((col("dim1") == '101') & (col("dim2").isin(['302','402']))).show()
#+  +  +  -+   +   +
#|dim1|dim2|byvar|value1|value2|
#+  +  +  -+   +   +
#+  +  +  -+   +   +

Using expr:

在这里,我们需要将列表转换为tuple以对value_list执行in

#using filter_str
value_list = ['302', '402']
filter_str = "dim1 = '101' or dim2 in {0}".format(tuple(value_list))
filter_str
#"dim1 = '101' or dim2 in ('302', '402')"
df.filter(expr(filter_str)).show()
#+  +  +   -+   +   +
#|dim1|dim2|  byvar|value1|value2|
#+  +  +   -+   +   +
#| 101| 201|MTD0001|     1|    10|
#| 301| 302|MTD0003|     3|    13|
#| 401| 402|MTD0004|     5|    19|
#+  +  +   -+   +   +

filter_str = "dim1 = '101' and dim2 in {0}".format(tuple(value_list))
df.filter(expr(filter_str)).show()
#+  +  +  -+   +   +
#|dim1|dim2|byvar|value1|value2|
#+  +  +  -+   +   +
#+  +  +  -+   +   +

相关问题 更多 >