有几个华为的大牛给 spark sql 做了 cost-based optimizer
jira task 在 https://issues.apache.org/jira/browse/SPARK-16026
design specs 在
https://issues.apache.org/jira/secure/attachment/12823839/Spark_CBO_Design_Spec.pdf
分享的 slides 在
https://spark-summit.org/2016/events/enhancing-spark-sql-optimizer-with-reliable-statistics/
大概读了下,记录如下
1.改了哪里
改动大概在这里
2.做了什么.
2.1 统计信息
收集字段的统计信息,最大值,最小值,空值,唯一值和统计直方图
统计直方图有两种:定宽和定高的,小于 256 个唯一值的时候定宽,大于的时候定高
2.2 关联
两表 hash 关联的时候根据到达这一步的总体 cost 来选择驱动表( build / probe)
多表关联的时候使用动态规划来决定 join order,先找出两表关联时 cost 最低的,然后是第三个表和这个中间表关联...最后根据所有关联总的 cost 计算 cost
2.3 cost function
目前实现的是 phase 1 ,两表关联时的 cost 就是结果集的大小,未来会实现和 teradata 类似的,考虑各种执行时的 cost
2.4 Cardinality Estimation
还没细看,感觉和其他 cbo 的 rdbms 差不多
2.5 会给所有 executor 算一个 cost
3.jira 上提到的问题
感觉好像没有特别考虑 geography 的问题,目前的实现也没有考虑不同表格式带来的影响, 另外这个 spec 最开始只给 databricks 公司里的 commiter 看过,社区其他 committer 好像对此颇有微词
总之还是很牛逼的,膜拜下大牛们