Spark中的连接表是否会增加较小表的选定列?

时间:2018-04-08 09:24:34

标签: apache-spark apache-spark-sql query-optimization

我在spark中有两个表:

T1
|--x1
|--x2

T2
|--z1
|--z2
  • T1远大于T2
  • 第z2列中的值非常大
  • T1和T2之间分别有很多关系(通过 x2和z1列。)

我执行以下查询:

select T1.x1, T2.z2 from T1
join T2 on T1.x2 = T2.z1

在结果数据集中,T2.z2中的相同值将乘以许多T1.x1值。

由于此值非常重 - 我担心数据是否实际重复,或者是否存在仅维护引用的内部优化?

1 个答案:

答案 0 :(得分:0)

没有涵盖所有可能情况的答案。具体行为取决于因素的数量:

  • 连接类型 - 广播连接将根据定义在不同节点上复制您的数据,哈希连接赢得了
  • 可用内存量 - 序列化数据的任何数据溢出都可能会复制输出的内存要求。
  • 缓存,数据分发和数据类型 - Spark使用逐列而非逐行表示进行缓存,并根据数据类型和运行时统计信息在列上进一步使用不同的压缩和编码技术。

只有第一个项目符号是公共API的一部分,其余部分是内部的,可能因版本而异。

在其余情况下,Spark行为与标准Java / Scala代码没有区别 - 引用只是引用,我不知道在这个空间中有任何优化。