现在我有以下代码:
df1 = df.filter((df.col1.isin(List1)) | (df.col2.isin(List2)))
我从数据帧执行collect()
得到了List1,所以我喜欢使用join
我尝试了以下
df1=df.filter(df.col2.isin(List2))
df2=df.join(df_List1,'col1','leftsemi')
df3=df1.join(df2,'col1' ,'outer')
我有两个问题:
答案 0 :(得分:2)
是否值得做性能
与往常一样,在询问与绩效相关的问题时,您应该对真实数据(或真实反映数据真实分布的数据)和使用实际资源进行测试。
话虽如此,如果List1
和List2
足够小df.filter((df.col1.isin(List1)) | (df.col2.isin(List2)))
以便查询成功,很难预计使用joins
会有任何改进,因为{{1基于OR
的{{1}}无法轻松优化。
可以表达为:
JOINS
或
SELECT DISTINCT col1, col2 FROM (
SELECT t.* FROM t JOIN r1 WHERE t.col1 = r1.col1
UNION
SELECT t.* FROM t JOIN r2 WHERE t.col2 = r2.col2
)
一般情况下(我们可以安全地省略WITH
t1 AS (SELECT t.* FROM t JOIN r1 WHERE t.col1 = r1.col1),
t2 AS (SELECT t.* FROM t JOIN r2 WHERE t.col2 = r2.col2)
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.col1 = t2.col1 -- if col1 is an unique identifier
小到足以存储在单个机器的内存中的情况)两者都需要t
的完全洗牌,大小为t
一个限制因素。
此外,当第一个分量为真时,与本地对象的逻辑分离可以进行短路评估。在一般的连接案例中不可能这样做。
将来Spark应该支持t
(SPARK-23945)中的单列DataFrame
,优化器应该能够在广播和散列连接之间做出决定。