前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SparkSql序列化时列的ID是在哪里生成的呢?

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

作者头像
数据仓库践行者
发布2022-11-25 19:55:33
7210
发布2022-11-25 19:55:33
举报

面向群友写文,哈哈

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

(原谅我,喜欢晒截图)

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

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

代码语言:javascript
复制
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 这里计算:

代码语言:javascript
复制
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的运行原理~

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-18,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 数据仓库践行者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 那这个id是什么时候生成的呢?
  • 1、SQLTestData 类中,生成testData2
  • 2、SQLImplicits隐式转换把rdd转成DataSet
  • 3、SQLImplicits 类的执行流程
  • SQLImplicits --> LowPrioritySQLImplicits -->newProductEncoder -->Encoders.product[T] --> ExpressionEncoder
  • 4、ExpressionEncoder类的运行流程
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com