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

时间:2020-05-20 14:18:30

标签: python dataframe pyspark pyspark-dataframes

我有一个过滤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:filter_str =“ dim2 ='201'”

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和2以及如何修改过滤器部分。

1 个答案:

答案 0 :(得分:1)

过滤器查询中使用 & (或) | 运算符,并用方括号{ {1}}。

()

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| #+----+----+-----+------+------+ #+----+----+-----+------+------+

在这里,我们需要将 list 转换为 Using expr: ,以便在tuple上执行in

value_list