快速spark替代其他列中的where列

vbkedwbf  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(321)

我正在寻找一个快速Pypark替代品

SELECT foo FROM bar
WHERE foo IN (SELECT baz FROM bar)

预先收集到python列表中绝对不是一个选项,因为处理的Dataframe非常大,相对于我提出的另一个选项,collect占用了大量的时间。所以我想不出一个方法来使用一个土生土长的pysparkian where(col(bar).isin(baz))baz 在这种情况下必须有一份清单。
我想到的一个选择是 right JOIN 作为in和 left_semi JOIN 作为not in的替换,请考虑以下示例:

bar_where_foo_is_in_baz = bar.join(bar.select('baz').alias('baz_'), col('foo') == col('baz_'), 'right').drop('baz_')

然而,这是相当冗长的,很难解释时,阅读了一段时间,并在一个相当多的条件时,在处理大量的头部抓挠结果 WHERE 所以我想避免这样。
还有其他选择吗?
编辑(请阅读):
由于我似乎已经误导了相当多的答案,我的具体要求是将“where-in”子句翻译成pyspark .collect() 或者一般来说,Map到pythonic list(作为内部函数 .isin() 需要我)。

u0njafvf

u0njafvf1#

来自jacek laskowski的gitbook
sparksql使用广播连接(也称为广播散列连接)而不是散列连接来优化连接查询,当一方数据的大小小于 spark.sql.autoBroadcastJoinThreshold 广播连接对于具有相对较小表(维度)的大表(事实)之间的连接非常有效,然后可以使用这些表来执行星型模式连接。它可以避免通过网络发送大表的所有数据。
还有
spark sql 2.2支持使用广播标准函数或sql注解的广播提示: SELECT /*+ MAPJOIN(b) */ …​ SELECT /*+ BROADCASTJOIN(b) */ …​ SELECT /*+ BROADCAST(b) */ …​ 实际上,spark文档更全面地介绍了以下提示:
广播提示引导spark在将每个指定表与另一个表或视图连接时广播它们。当spark决定连接方法时,广播散列连接(即bhj)是首选的,即使统计数据高于配置 spark.sql.autoBroadcastJoinThreshold .
当连接的两边都被指定时,spark广播具有较低统计信息的那一边。注:spark不保证总是选择bhj,因为并非所有情况(例如完全外部连接)都支持bhj。
最后,如果你真的想开发高效的spark工作,你应该花一些时间来理解这个怪兽是如何工作的。
例如,关于来自databricks的连接的表示应该是有帮助的

相关问题