作者回复: Perfect x 2!标准答案了~ 💯 回答的非常好了,无可挑剔~
作者回复: 第二题分析的很到位,就是你说的这么回事。偏函数的特性,刚好符合Spark SQL优化规则的特点,也就是: 1. 不完备 2. 保持扩展的灵活性 问题三是个超级好的问题,其实我一直想找机会说说。在传统的DBMS里,CBO是主流,RBO是辅助性的。原因其实很简单,RBO毕竟是出于启发式的,都是一些“经验主义”,CBO才是真正“尊重”事实、尊重运行时的优化策略。在传统DBMS里面,CBO是非常成熟的技术了,已经沿用很多很多年了。 然而,Spark SQL的CBO相对就比较鸡肋了,原因其实我在第24讲会详细展开,提前剧透一下,就是Spark SQL的CBO有三个非常大的痛点:窄、慢、静 窄:窄指的是适用面太窄,CBO仅支持注册到Hive Metastore的数据表,但在大量的应用场景中,数据源往往是存储在分布式文件系统的各类文件,如Parquet、ORC、CSV等等。 慢:慢指的是统计信息的搜集效率比较低。对于注册到Hive Metastore的数据表,开发者需要调用ANALYZE TABLE COMPUTE STATISTICS语句收集统计信息,而各类信息的收集会消耗大量时间。 静:静指的是静态优化,这一点与RBO一样。CBO结合各类统计信息制定执行计划,一旦执行计划交付运行,CBO的使命就算完成了。这一点和传统DBMS很不同,传统DBMS的CBO是动态的,可以在运行时做适当调整。 不仅如此,目前Spark SQL的CBO,还仅仅支持Join策略,换句话说,与Join无关的查询,CBO使不上劲。 因此,综上,CBO虽然是个非常吸引人的东西,但是Spark SQL的CBO很鸡肋,当然这有很多原因,比如CBO本身的限制,社区对于Spark SQL优化方向的考虑,等等。其实AQE的推出,就表示Spark社区已经做出了选择。就我个人观察(仅代表个人观点哈),CBO的地位和角色可能会越来越尴尬,用武之地可能会越来越小,聊胜于无。当然,再次重申,这仅仅是我个人的观点哈~ 另外,这两个问题kingcall同学回答的比较好,可以参考他的答案哈~
作者回复: 对,你说的没错,确实只有列存才能从列剪裁受益,行存不行。
作者回复: Project是投影的意思,实际上对应的就是你SQL或是DataFrame中的select语句,也就是说,在众多的数据列中,你要“投影”出哪些列,说白了,就是选出哪些列。 Project也会,Select也好,本身都不是算子哈,不管是SQL查询,还是DSL查询,都需要show、count、save等action算子来触发计算。
作者回复: 哈哈哈,喜欢就好~ 兄弟五一节快乐~
作者回复: 好问题~ 就Spark SQL目前的实现来看,它是在Analyzed Logical Plan之上做的这一步优化,也就是你说的“优化前”阶段。
作者回复: 老弟可以提供更详细的信息吗?比如具体的SQL语句,Spark和Hive的版本号,不同的Hive版本之间的差异还是挺大的
作者回复: 对,没错,完美契合!老弟这进度赶得飞起啊~ 都追到21讲了~ 赞👍
作者回复: 对,构建语法树、Schema验证、谓词下推、列剪裁,这些其实是绝大多数的数仓都有的优化策略。 实际上,相比传统DBMS,Spark SQL的优化流程算是简化版的了,比如传统DBMS还会有Query Re-writer、CBO(基于成本的优化)等等。
作者回复: 有的,CBO,不过CBO有各种毛病,这块在AQE 24讲有介绍。 但是,CBO 也面临三个方面的窘境:“窄、慢、静”。窄指的是适用面太窄,CBO 仅支持注册到 Hive Metastore 的数据表,但在大量的应用场景中,数据源往往是存储在分布式文件系统的各类文件,如 Parquet、ORC、CSV 等等。慢指的是统计信息的搜集效率比较低。对于注册到 Hive Metastore 的数据表,开发者需要调用 ANALYZE TABLE COMPUTE STATISTICS 语句收集统计信息,而各类信息的收集会消耗大量时间。静指的是静态优化,这一点与 RBO 一样。CBO 结合各类统计信息制定执行计划,一旦执行计划交付运行,CBO 的使命就算完成了。换句话说,如果在运行时数据分布发生动态变化,CBO 先前制定的执行计划并不会跟着调整、适配。