我正在研究Spark SQL的成本函数。 在对TABLE SCAN行为进行建模时,我无法理解READ和WRITE是在流水线中还是按顺序执行。
让我们考虑以下SQL查询:
SELECT * FROM table1 WHERE columnA ='xyz';
每项任务:
(1),(2)和(3)是按顺序还是在管道中进行?换句话说,首先完全读取数据块(构成它的所有磁盘页),然后将其过滤,然后将其重写到磁盘或这些活动是否在管道中执行? (即在读取(n + 1)元组时,可以处理和写入n元组。)
提前致谢。
答案 0 :(得分:0)
每当你提交一份工作时,首先要做的就是为你的工作创建DAG(定向非循环图)。
创建DAG后,spark知道它可以并行运行哪些任务,哪个任务依赖于上一步的输出等等。
所以,在你的情况下, Spark将并行读取您的数据(您可以在分区中看到),将其过滤掉(在每个分区中)。 现在,由于保存了所需的过滤,因此它将等待至少一个分区的过滤完成,然后开始保存它。
答案 1 :(得分:0)
经过一番挖掘后,我发现Spark SQL使用了所谓的“火山风格拉模型”。 根据这样的模型,一个简单的扫描 - 过滤 - 写入查询应该在管道中执行并且是完全分布的。
换句话说,在读取分区(HDFS块)时,可以对读取行执行过滤。无需读取整个块即可启动过滤。相应地进行写作。