如何解决如何在Spark中级联未知数量的条件而不遍历每个条件
我想基于已处理的用户查询来过滤数据帧,但是条件的数量不是恒定的,并且会因用户而异。例如,假设两个用户将具有以下不同条件
1- df.filter( ( col('A') == 'book' ) & (col('B') == '1') & (col('C') == '0') )
2- df.filter( ( col('A') == 'film') ) & (col('B') == '0'))
一种解决方案是按顺序层叠条件
for k,v in argList:
df = df.filter(col(k) == v)
其中argList是每个用户的条件列表,例如
[('A','book'),('B','1'),('C','0')]
或[('A','film'),'0')]
,.....
有没有更好的方法来级联多个条件而不遍历每个条件?
解决方法
遍历条件没有错,因为Spark优化器会将所有过滤器组合为一个过滤器:
df = spark.createDataFrame([(1,2),(1,4),(5,6)],['A','B'])
df = df.filter(F.col('A') == 1)
df = df.filter(F.col('B') == 4)
df.explain()
打印
== Physical Plan ==
*(1) Filter (((isnotnull(A#0L) AND isnotnull(B#1L)) AND (A#0L = 1)) AND (B#1L = 4))
+- *(1) Scan ExistingRDD[A#0L,B#1L]
,仅执行一次过滤操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。