使用变量列表值的 pyspark 数据框过滤器
pyspark dataframe filter using variable list values
我有一个过滤 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
你能帮忙实现 scr 1 和 2 吗?如果我得到我提到的 filter_str 字符串,如何修改过滤器部分。
在你的 filter 查询并用方括号 ()
.
将每个语句括起来
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:
这里我们需要将list转换为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|
#+----+----+-----+------+------+
#+----+----+-----+------+------+
我有一个过滤 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
你能帮忙实现 scr 1 和 2 吗?如果我得到我提到的 filter_str 字符串,如何修改过滤器部分。
在你的 filter 查询并用方括号 ()
.
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:
这里我们需要将list转换为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|
#+----+----+-----+------+------+
#+----+----+-----+------+------+