我正在寻找一个快速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()
需要我)。
1条答案
按热度按时间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的连接的表示应该是有帮助的