Apache spark Spark内部:项目的好处

Apache spark Spark内部:项目的好处,apache-spark,internals,catalyst-optimizer,Apache Spark,Internals,Catalyst Optimizer,我已经阅读了OP试图转换此逻辑计划的内容: Aggregate [sum(inc(vals#4L)) AS sum(inc(vals))#7L] +- LocalRelation [vals#4L] 为此: Aggregate [sum(inc_val#6L) AS sum(inc(vals))#7L] +- Project [inc(vals#4L) AS inc_val#6L] +- LocalRelation [vals#4L] 我有几个问题: 他为什么要让项目负责人来?优势是什

我已经阅读了OP试图转换此逻辑计划的内容:

Aggregate [sum(inc(vals#4L)) AS sum(inc(vals))#7L]
+- LocalRelation [vals#4L]
为此:

Aggregate [sum(inc_val#6L) AS sum(inc(vals))#7L]
+- Project [inc(vals#4L) AS inc_val#6L]
   +- LocalRelation [vals#4L]
我有几个问题:

他为什么要让项目负责人来?优势是什么 什么? 据我所知,Project是表示SELECT语句的运算符, 那么,一个计划怎么可能不包括项目运营商呢? 前提:聚合包括两个步骤:

部分骨料的计算

然后是洗牌和全局聚合

聚合基本上是一个两阶段操作

他为什么要让项目负责人来?它的优点是什么? 我可以想到两种情况: 启用Codegen:启用Codegen后,整个阶段(包括UDF阶段)的代码将在单个迭代器中运行。当UDF是CPU密集型/内存密集型等时,这可能会导致内存问题。请注意,聚合发生在同一迭代器中。 禁用Codegen:禁用Codegen后,每个操作符将在其自己的迭代器中运行。由于我们已经将聚合与UDF运行解耦,OOM/CPU变高的可能性降低了。 据我所知,Project是表示SELECT语句的操作符,那么一个计划怎么可能不包含Project操作符呢? 只要最后一个操作符返回所需的列,我们就不需要显式项目。例如,假设最上面的运算符say筛选器返回3列。如果要求我们需要3列作为输出,则不需要显式项目。如果我们只需要三分之二,我们需要一个明确的项目。优化器规则将此作为查询规划的一部分。 前提:聚合包括两个步骤:

部分骨料的计算

然后是洗牌和全局聚合

聚合基本上是一个两阶段操作

他为什么要让项目负责人来?它的优点是什么? 我可以想到两种情况: 启用Codegen:启用Codegen后,整个阶段(包括UDF阶段)的代码将在单个迭代器中运行。当UDF是CPU密集型/内存密集型等时,这可能会导致内存问题。请注意,聚合发生在同一迭代器中。 禁用Codegen:禁用Codegen后,每个操作符将在其自己的迭代器中运行。由于我们已经将聚合与UDF运行解耦,OOM/CPU变高的可能性降低了。 据我所知,Project是表示SELECT语句的操作符,那么一个计划怎么可能不包含Project操作符呢? 只要最后一个操作符返回所需的列,我们就不需要显式项目。例如,假设最上面的运算符say筛选器返回3列。如果要求我们需要3列作为输出,则不需要显式项目。如果我们只需要三分之二,我们需要一个明确的项目。优化器规则将此作为查询规划的一部分。
谢谢你的回答。我理解第2节。我不明白第一节。Project如何帮助解决您提到的问题?这种差异在于查询的执行方式。在没有codegen的情况下,Spark使用valcano优化器模型执行,其中每个操作符分别执行,出现错误的可能性较小,例如OOM等。然而,当启用codegen时,所有运算符都会折叠并作为单个函数执行,因此出错的可能性会增加,特别是当其中一个运算符涉及UDFsI时,我了解禁用codegen的优势。我只是不明白这和OP想要在他的计划中有一个项目运营商有什么关系,明白了吗。我总是假设OP会禁用codegen,并根据它给出我的答案:也许还有其他原因使用它,比如项目运营商的指标等,但是从代码中没有任何东西谢谢你的回答。我理解第2节。我不明白第一节。Project如何帮助解决您提到的问题?这种差异在于查询的执行方式。在没有codegen的情况下,Spark使用valcano优化器模型执行,其中每个操作符分别执行,出现错误的可能性较小,例如OOM等。然而,当启用codegen时,所有运算符都会折叠并作为单个函数执行,因此出错的可能性会增加,特别是当其中一个运算符涉及UDFsI时,我了解禁用codegen的优势。我只是不明白这和OP想要在他的计划中有一个项目运营商有什么关系,明白了吗。我总是假设OP会禁用codegen,并以此为基础给出我的答案:也许有其他原因使用它,比如项目运营商的指标等,但从代码来看,没有任何原因