Apache spark 解释运算符中的数字前缀是什么意思?
Apache spark 解释运算符中的数字前缀是什么意思?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,(1)、(6)和(3)在下面的解释输出中是什么意思。Spark版本是2.3.1 我想大概是在Spark 2.0左右,Spark SQL开始为结构化查询的某些部分生成Java代码。该特性称为整个阶段Java代码生成(也称为整个阶段代码生成) 全阶段Java代码生成(也称为全阶段代码生成)只是Spark SQL中的一种物理查询优化,它将多个物理运算符(作为支持代码生成的计划的子树)融合到一个Java函数中 您可以使用explain操作符了解Java生成的结构化查询的代码部分 val q = spar
(1)
、(6)
和(3)
在下面的解释输出中是什么意思。Spark版本是2.3.1
我想大概是在Spark 2.0左右,Spark SQL开始为结构化查询的某些部分生成Java代码。该特性称为整个阶段Java代码生成(也称为整个阶段代码生成)
全阶段Java代码生成(也称为全阶段代码生成)只是Spark SQL中的一种物理查询优化,它将多个物理运算符(作为支持代码生成的计划的子树)融合到一个Java函数中
您可以使用explain
操作符了解Java生成的结构化查询的代码部分
val q = spark.range(5)
.groupBy('id % 2 as "g")
.agg(collect_list('id) as "ids")
.join(spark.range(5))
.where('id === 'g)
scala> q.explain
== Physical Plan ==
*(3) BroadcastHashJoin [g#1266L], [id#1272L], Inner, BuildRight
:- *(3) Filter isnotnull(g#1266L)
: +- ObjectHashAggregate(keys=[(id#1264L % 2)#1278L], functions=[collect_list(id#1264L, 0, 0)])
: +- Exchange hashpartitioning((id#1264L % 2)#1278L, 200)
: +- ObjectHashAggregate(keys=[(id#1264L % 2) AS (id#1264L % 2)#1278L], functions=[partial_collect_list(id#1264L, 0, 0)])
: +- *(1) Range (0, 5, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
+- *(2) Range (0, 5, step=1, splits=8)
正如您所注意到的,我有一个带3个星号的圆括号数字的查询。这些装饰(星号和数字)都是整个java代码生成优化阶段的一部分
这些数字表示sparksql为其生成单独的函数的完整的tagecodegen子树,这些函数一起是sparksql用于执行查询的底层代码
您可以使用debug
隐式界面查看代码和子树
scala> q.queryExecution.debug.codegen
Found 3 WholeStageCodegen subtrees.
== Subtree 1 / 3 ==
*(1) Range (0, 5, step=1, splits=8)
Generated code:
...
我想大概是在Spark 2.0左右,Spark SQL开始为结构化查询的某些部分生成Java代码。该特性称为整个阶段Java代码生成(也称为整个阶段代码生成)
全阶段Java代码生成(也称为全阶段代码生成)只是Spark SQL中的一种物理查询优化,它将多个物理运算符(作为支持代码生成的计划的子树)融合到一个Java函数中
您可以使用explain
操作符了解Java生成的结构化查询的代码部分
val q = spark.range(5)
.groupBy('id % 2 as "g")
.agg(collect_list('id) as "ids")
.join(spark.range(5))
.where('id === 'g)
scala> q.explain
== Physical Plan ==
*(3) BroadcastHashJoin [g#1266L], [id#1272L], Inner, BuildRight
:- *(3) Filter isnotnull(g#1266L)
: +- ObjectHashAggregate(keys=[(id#1264L % 2)#1278L], functions=[collect_list(id#1264L, 0, 0)])
: +- Exchange hashpartitioning((id#1264L % 2)#1278L, 200)
: +- ObjectHashAggregate(keys=[(id#1264L % 2) AS (id#1264L % 2)#1278L], functions=[partial_collect_list(id#1264L, 0, 0)])
: +- *(1) Range (0, 5, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
+- *(2) Range (0, 5, step=1, splits=8)
正如您所注意到的,我有一个带3个星号的圆括号数字的查询。这些装饰(星号和数字)都是整个java代码生成优化阶段的一部分
这些数字表示sparksql为其生成单独的函数的完整的tagecodegen子树,这些函数一起是sparksql用于执行查询的底层代码
您可以使用debug
隐式界面查看代码和子树
scala> q.queryExecution.debug.codegen
Found 3 WholeStageCodegen subtrees.
== Subtree 1 / 3 ==
*(1) Range (0, 5, step=1, splits=8)
Generated code:
...
奇怪的是,我对合成数据帧运行了几次explain
,但没有看到这些数字。你能分享一下代码片段吗?这样我就可以在我的环境中重现这个代码了?@morsik这些数字是在Spark 2.2周围加上去的。你的Spark版本是什么?我使用2.2.0,这很奇怪,我对合成数据帧运行了几次explain
,但没有看到这些数字。你能分享一下代码片段吗?这样我就可以在我的环境中重现这个代码了?@morsik这些数字是在Spark 2.2周围加上去的。你的Spark版本是什么?我用的是2.2.0too@thebluephantom当然你不是。最终,对于大多数结构化查询,您将得到RDD和任务。谢谢@JacekLaskowski@thebluephantom当然你不是。最终,对于大多数结构化查询,您将得到RDD和任务。谢谢@JacekLaskowski