Pyspark AND/ALSO分区列查询

vlf7wbxs  于 2022-12-27  发布在  Apache
关注(0)|答案(1)|浏览(127)

如何在pyspark中执行AND/ALSO查询?我希望两个条件都满足才能过滤结果。
原始 Dataframe :

df.count()
4105

第一个条件未找到任何记录:

df.filter((df.created_date != 'add')).count()
4105

因此,我希望这里的AND子句返回4105,但是它继续过滤df.lastUpdatedDate

df.filter((df.created_date != 'add') & (df.lastUpdatedDate != '2022-12-21')).count()
3861

对我来说,3861是OR子句的结果,我该如何解决这个问题?lastUpdatedDate是一个基于.explain()的分区过滤器,所以这可能与这些结果有关?
...分区筛选器:[不为空(最后更新日期#26),NOT(最后更新日期#26 = 2022年12月21日)],推送过滤器:[不为空(创建日期),不等于(创建日期,添加))],读取架构...

b4lqfgs4

b4lqfgs41#

根据我们在评论中的对话-您的要求是过滤掉(df. created_date!='add')&(df. lastUpdatedDate!='2022 - 12 - 21')
您的困惑似乎在于方法的名称,即filter,而应考虑它的位置
Where或Filter by definition的工作原理与SQL Where子句相同,即保留表达式返回true的行,并丢弃其余行。
例如,考虑一个 Dataframe

+---+-----+-------+
| id| Name|Subject|
+---+-----+-------+
|  1|  Sam|History|
|  2|  Amy|History|
|  3|Harry|  Maths|
|  4| Jake|Physics|
+---+-----+-------+

下面的过滤器将返回一个新的Dataframe,其中仅包含主题为历史记录的行,即表达式返回true的行(即过滤掉false的行)

rightDF.filter(rightDF.col("Subject").equalTo("History")).show();

rightDF.where(rightDF.col("Subject").equalTo("History")).show();

输出:

+---+----+-------+
| id|Name|Subject|
+---+----+-------+
|  1| Sam|History|
|  2| Amy|History|
+---+----+-------+

因此,在您的情况下,您可能希望否定语句以获得所需的结果。
即使用等于代替不等于

df.filter((df.created_date == 'add') & (df.lastUpdatedDate == '2022-12-21')).count()

这意味着保留两个语句都为True的行,并过滤掉其中任何一个为False的行
告诉我这个是否管用

相关问题