【发布时间】:2020-09-03 21:17:20
【问题描述】:
我正在寻找一种快速的 PySpark 替代品
SELECT foo FROM bar
WHERE foo IN (SELECT baz FROM bar)
预先收集到 Python 列表中绝对不是一个选项,因为处理的数据帧非常大,并且相对于我提出的其他选项,收集占用了大量时间。所以我想不出一种使用原生 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”子句翻译成没有 .collect() 的 PySpark,或者一般来说,映射到 Pythonic 列表(作为内部函数 @987654332 @ 需要我)。
【问题讨论】:
-
Pyspark 有不错的 SQL 支持,所以相信你可以使用 pyspark SQL 库来做到这一点。 spark.apache.org/docs/2.2.0/… 应该让你继续前进。 databricks-prod-cloudfront.cloud.databricks.com/public/… 也用于参考。
-
听起来不错,我去看看,谢谢。
-
你知道“broadcast JOIN”的工作原理就是这样,即在所有执行程序中创建一个值的哈希图吗?所以这是一个简单的 SQL 查询,如果你想确保 Spark 优化器不会出错,还有一个额外的提示。不要重新发明轮子。自 25 年前第一个 MPP 数据库以来,此类问题就一直存在。
-
在 spark 我认为你最好的选择是使用 left_semi 或 left_anti
-
stackoverflow.com/questions/42545788/… 似乎有你需要的答案。