前言
上一篇文章Hudi Spark SQL源码学习总结-Create Table总结了Create Table
的源码执行逻辑,这一篇继续总结CTAS
,之所以总结CTAS
,是之前在我提交的一个PR中发现,Spark2和Spark3.2.1版本的CTAS的逻辑不一样,最终走的Hudi实现类也不一样,所以本文分Spark2和Spark3.2.1两个版本分析
不同点
先总结一下Spark2和Spark3.2.1的整体逻辑的不同点
Spark2: visitCreateTable
->CreateTable
->CreateHoodieTableAsSelectCommand.run
Spark3.2.1: 前提配置了:spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog
,如果没有配置则和Spark2一样
visitCreateTable
->CreateTableAsSelectStatement
->isV2Provider
->true->CreateTableAsSelect
->HoodieCatalog.createHoodieTable
visitCreateTable
->CreateTableAsSelectStatement
->isV2Provider
->false->CreateTable
->CreateHoodieTableAsSelectCommand.run
Spark2和Spark3.2.1不同的关键点有两个:
- 1、配置
spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog
- 2、isV2Provider(“hudi”)返回ture
只要有一个不满足,Spark3.2.1的逻辑就和Spark2一样,引进HoodieCatalog
和令hudi
为V2Provider的PR为: [HUDI-3254] Introduce HoodieCatalog to manage tables for Spark Datasource V2
目前master最新代码已将spark3.2.1的isV2Provider(“hudi”)改为了false,也就是Spark2和Saprk3.2.1的逻辑又一致了,PR:[HUDI-4178] Addressing performance regressions in Spark DataSourceV2 Integration
版本
Hudi https://github.com/apache/hudi/pull/5592 本文基于这个PR对应的代码进行调试分析,因为我就是在贡献这个PR时才发现Spark3.2.1和Saprk2的CTAS
的逻辑不同的