【问题标题】:pyspark dataframe filter using variable list values使用变量列表值的pyspark数据框过滤器
【发布时间】:2020-05-20 22:46:04
【问题描述】:

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

【问题讨论】:

  • 有什么理由在字符串中写条件而不是写实际条件?
  • 我得到的部分要求是用户将过滤条件作为参数(字符串类型)与过滤列和值一起传递。

标签: python dataframe pyspark pyspark-dataframes


【解决方案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|
#+----+----+-----+------+------+
#+----+----+-----+------+------+

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

【讨论】:

  • 感谢您的回复,这很有帮助。为什么我们没有得到 and 条件的输出??
  • @SureshGudimetla,我们没有匹配 dim1=101dim2 =302 or dim2=402 的行!
  • 对不起,我知道了,它工作得很好......能够完成编码部分。谢谢
猜你喜欢
  • 2016-09-12
  • 2020-09-22
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2019-03-07
  • 2017-03-18
相关资源
最近更新 更多