SparkSql序列化时列的ID是在哪里生成的呢?

文章探讨了SparkSQL在生成解析后的逻辑执行计划时如何通过catalog绑定字段和元数据库,特别提到了字段ID的生成过程,主要涉及ExpressionEncoder类的作用,以及在创建临时视图时的步骤。通过对createOrReplaceTempView的分析,展示了字段由未解析到解析的过程中ID的生成时机和方法。
摘要由CSDN通过智能技术生成

面向群友写文,哈哈

有点抽象,但群友们一定知道我在写什么

(原谅我,喜欢晒截图)

分享课上没有trace详细代码,这篇顺一下这块的代码。

sparksql生成解析后的逻辑执行计划时,会通过catalog把各个字段和元数据库绑定,也就说在ResolveLogical的阶段的字段是带了id的:

SELECT A,B FROM TESTDATA2
​
==  Parsed Logical Plan  ==
'Project ['A, 'B]
+- 'UnresolvedRelation [TESTDATA2], [], false
​
== Analyzed Logical Plan ==
Project [A#3, B#4]
+- SubqueryAlias testdata2
   +- View (`testData2`, [a#3,b#4])
      +- SerializeFromObject [knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).a AS a#3, knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).b AS b#4]
         +- ExternalRDD [obj#2]

可以看到从未解析到解析,字段由'Project ['A, 'B] --> Project [A#3, B#4]

那这个id是什么时候生成的呢?

id是在建表时或者创建临时视图时生成的。

我们以createOrReplaceTempView为例来看一下:

准备TESTDATA2测试数据时的逻辑——

1、SQLTestData 类中,生成testData2

2、SQLImplicits隐式转换把rdd转成DataSet

3、SQLImplicits 类的执行流程

SQLImplicits --> LowPrioritySQLImplicits -->newProductEncoder -->Encoders.product[T] --> ExpressionEncoder

下面图按顺序:

从上图可知会用到ExpressionEncoder类

4、ExpressionEncoder类的运行流程

sparksql源码中有很多操作是初始化类的时候做的

ExpressionEncoder.apply 这里计算:

val serializer = ScalaReflection.serializerForType(tpe)
val deserializer = ScalaReflection.deserializerForType(tpe)

--> new ExpressionEncoder[T](serializer,   deserializer, ClassTag[T](cls))

--> ExpressionEncoder.serializer (序列化操作)

-->CreateNamedStruct.flatten(匹配到If的分支调用CreateNamedStruct.flatten)

-->Alias(v, n.toString)(起别名)

-->exprId = NamedExpression.newExprId(ExprId就是序列化的id)

--> ExprId(curId.getAndIncrement(), jvmId)(序列化的id最终生成)

代码流程如下截图:

下篇写写createOrReplaceTempView的运行原理~

推荐阅读:

SparkSql中多个Stage的并发执行


Hey!

我是小萝卜算子

欢迎关注:数据仓库践行者

分享是最好的学习,这里记录我对数据仓库的实践的思考和总结

每天学习一点点

知识增加一点点

思考深入一点点

在成为最厉害最厉害最厉害的道路上

很高兴认识你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萝卜算子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值