数据框架上的多条件过滤器



谁能向我解释为什么我会为这2个表达式获得不同的结果?我正在尝试在两个日期之间过滤:

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

结果:37m

vs

df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")
  .select("col1","col2").distinct().count()

结果:25m

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

tl; dr 将多个条件传递给filterwhere使用Column对象和逻辑操作员(&|~)。请参阅Pyspark:子句中的多个条件。

df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))

您也可以使用单个 sql字符串:

df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")

实际上,在以下之间使用更有意义:

df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")

第一种方法甚至没有远程有效。在Python中,and返回:

  • 如果所有表达式都是"真实的"。
  • 否则第一个"假"元素。

结果

"act_date <='2017-04-01'" and "act_date >='2016-10-01'"

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

"act_date >='2016-10-01'"

在第一种情况下

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

结果是值超过2016-10-01,这意味着所有高于2017-04-01的值。

,而在第二种情况下

df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")
  .select("col1","col2").distinct().count()

结果是在2016-10-01到2017-04-01之间的值。

相关内容

  • 没有找到相关文章

最新更新