当我学习spark SQL时,我脑子里有一个问题:
如上所述,SQL执行结果是SchemaRDD,但是场景背后会发生什么?优化执行计划中的转换或操作有多少,应该等同于调用的普通RDD手写代码?
如果我们手工编写代码而不是SQL,它可能会生成一些中间RDD,例如:源RDD上的一系列map(),filter()操作。但是SQL版本不会生成中间RDD,对吗?
根据SQL内容,生成的VM字节码还涉及分区,改组,纠正?但是,如果没有中间RDD,如何在工作机器上激活计划并执行它们?
实际上,我还是无法理解spark SQL和spark core之间的关系。他们如何互相交流?答案 0 :(得分:2)
要了解SparkSQL或dataframe / dataset DSL如何映射到RDD操作,请查看Spark使用explain
生成的物理计划。
sql(/* your SQL here */).explain
myDataframe.explain
在Spark的核心,RDD[_]
是使用分布式操作操作的基础数据类型。在Spark版本中,< = 1.6.x DataFrame
为RDD[Row]
,Dataset
是独立的。在Spark版本中,> = 2.x DataFrame
变为Dataset[Row]
。这并没有改变其下所有Spark使用RDD操作的事实。
要深入了解Spark执行情况,请阅读Understanding Spark Through Visualization。