DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

Spark Sql Join部分

背景

spark 1.6.2 -> spark 2.2

内存中的数据组织形式

memory

在内存中,改成了以列式存储为主

(1) 与numpy或者tensorflow接入时可实现zero serialization(零序列化)

(2) 与Spark的in-memory columnar-cache无缝兼容

(3) 更利于压缩技术的引入

CBO

基于成本的优化器CBO,是根据计算出的所有可能的物理计划的代价,选择代价最小的物理执行计划。关键点在于能评估一个物理执行计划的代价。

  • HashJoin中build side and probe side中的问题

  • 在 Spark SQL 中,Join主要有两种执行方式,Shuffle-based Join, BroadcastJoin。Shuffle-based Join会有Shuffle,代价比较。BroadcastJoin不需要shuffle,但要求至少有一张表足够小,这样就能通过Broadcast机制,广播到每个Executor中。

    如下图所示,在没CBO的情况下,SparkSQL通过spark.sql.autoBroadcastJoinThreshold来判断是否选择BroadcastJoin(默认值为10MB)。如果判断基于原始表大小,会选用SortMergeJoin。

    在有CBO的情况下,经过Filter后的Table 2的大小正好满足小于10MB的情况下,会正确地采用性能更好的BroadcastJoin。

broadcast

  • 并行的join的情况