过滤以加入pyspark

时间:2018-04-07 20:26:49

标签: python apache-spark join pyspark

现在我有以下代码:

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')

我有两个问题:

  1. 转换原始陈述的正确方法是什么
  2. 是否值得做性能

1 个答案:

答案 0 :(得分:2)

  

是否值得做性能

与往常一样,在询问与绩效相关的问题时,您应该对真实数据(或真实反映数据真实分布的数据)和使用实际资源进行测试。

话虽如此,如果List1List2足够小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应该支持tSPARK-23945)中的单列DataFrame,优化器应该能够在广播和散列连接之间做出决定。