Spark SQL是否包括表流优化的连接,如果有,它如何决定哪个表流?
连接时,Hive假设最后一个表是最大的表。作为连接优化,它将尝试缓冲较小的连接表,并流式传输最后一个连接表。如果连接列表中的最后一个表不是最大的表,Hive有/*+ STREAMTABLE(tbl) */
提示,告诉它应该流式传输的表。从v1.4.1开始,Spark SQL不支持STREAMTABLE提示。
这个问题在Spark SQL之外的正常RDD处理中被问到。这个答案不适用于Spark SQL,因为开发人员无法控制显式缓存操作。
我在一段时间前寻找了这个问题的答案,我所能想到的是设置一个spark.sql.autoBroadcastJoinThreshold参数,默认为10 MB。然后它将尝试自动广播所有大小小于您设置的限制的表。连接顺序在此设置中不起作用。
如果您对进一步提高连接性能感兴趣,我强烈推荐这个演示。
这是即将到来的Spark 2.3在这里(RC2正在为下一个版本投票)。
从v1.4.1开始,Spark SQL不支持STREAMTABLE提示。
它也没有在最新的(并投票即将发布)Spark 2.3中。
不支持STREAMTABLE提示,但考虑到最近的变化(在SPARK-20857通用解析提示节点中),构建一个提示框架应该相当容易编写。
你必须写一些Spark优化和可能的物理计划(s)来支持STREAMTABLE(这看起来像很多工作),但这是可能的。工具在那里。
关于连接优化,在即将发布的Spark 2.3中有两个主要的逻辑优化:
- ReorderJoin
- CostBasedJoinReorder(专门用于基于成本的优化)