在 Apache Spark 中使用连接时,数据集大小的组织是否重要?
Does the organization of dataset size matter when using join in Apache Spark?
我有两个要加入的 RDD。一个非常大,XL
,另一个是常规尺寸,M
。为了速度,我加入他们的顺序重要吗?例如:
val data = M.join(XL)
对
val data =XL.join(M)
根据 ,不 重要。我不确定另一个问题是否相同,因为它询问的是表而不是 RDD。提问者可能指的是在 SparkSQL 中连接的表,但答案是关于 RDD 的。
在 'core' Spark 上,如果您使用 join
,顺序无关紧要。但是您可以使用广播变量优化连接并使用地图进行连接。
val bcSmallData = sc.broadcast(sRDD)
xlRDD.map{ case (k,v) => (k,(v, scSmallData.value.get(k)))}
查看此 'Advanced Spark' 演示文稿以获得详细说明。
现在,如果您使用 SparkSQL,此优化会自动为您完成。有一个配置选项 (spark.sql.autoBroadcastJoinThreshold
) 控制要广播的较小 table 的阈值大小。加入的顺序无关紧要。查询优化器将查看 RDD 大小。
我有两个要加入的 RDD。一个非常大,XL
,另一个是常规尺寸,M
。为了速度,我加入他们的顺序重要吗?例如:
val data = M.join(XL)
对
val data =XL.join(M)
根据
在 'core' Spark 上,如果您使用 join
,顺序无关紧要。但是您可以使用广播变量优化连接并使用地图进行连接。
val bcSmallData = sc.broadcast(sRDD)
xlRDD.map{ case (k,v) => (k,(v, scSmallData.value.get(k)))}
查看此 'Advanced Spark' 演示文稿以获得详细说明。
现在,如果您使用 SparkSQL,此优化会自动为您完成。有一个配置选项 (spark.sql.autoBroadcastJoinThreshold
) 控制要广播的较小 table 的阈值大小。加入的顺序无关紧要。查询优化器将查看 RDD 大小。