数据帧上的多个条件过滤器

fem*_*yte 17 python dataframe apache-spark apache-spark-sql pyspark

任何人都可以向我解释为什么我会得到这两个表达式的不同结果?我想在两个日期之间过滤:

df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()
Run Code Online (Sandbox Code Playgroud)

结果:37M

VS

df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()
Run Code Online (Sandbox Code Playgroud)

结果:25M

他们有什么不同?在我看来,他们应该产生相同的结果

zer*_*323 30

TL; DR要传递多个条件filterwhere使用Column对象和逻辑运算符(&,|,~).请参阅Pyspark:when子句中的多个条件.

df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))
Run Code Online (Sandbox Code Playgroud)

您还可以使用单个 SQL字符串:

df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")
Run Code Online (Sandbox Code Playgroud)

在实践中,使用之间更有意义:

df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")
Run Code Online (Sandbox Code Playgroud)

第一种方法甚至不是远程有效的.在Python中,and返回:

  • 如果所有表达式都是"真实的",那么最后一个元素.
  • 否则,第一个"假"元素.

结果是

"act_date <='2017-04-01'" and "act_date >='2016-10-01'"
Run Code Online (Sandbox Code Playgroud)

被评估为(任何非空字符串都是真实的):

"act_date >='2016-10-01'"
Run Code Online (Sandbox Code Playgroud)