Spark作为一个分布式计算引擎,其核心模块SQL支持外部数据源扩展,极其提高了其应用场景的广度和深度。自定义外部数据源,网上存在大量的学习资料,但Spark内部如何实现这些扩展机制的资料,去少之又少。我阅读并调试了大量的代码,最终理清了其脉络,由于涉及篇幅较多,我只写了核心过程,掌握这些过程,对理解sql扩展数据源机制会有极大帮助。
由于内容比较枯燥,建议读者结合Spark代码去分析下面的内容
关键抽象逻辑:
Sessionstate抽象类BaseSessionStateBuilder,被每一个应用端sessionstate使用。其内部定义一个Analyzer解析器。数据源相关逻辑规则
1、覆盖extendsResolutionRules并定义FindDataSourceTable规则,其会判断logicalplan是否是SimpleCatalogRelation,如果是,则把外部数据源数据包装成LogicalRelation(Relation),这个转换在创建表、查询和插入阶段均会使用。
2、覆盖postHocResolutionRules,并定义DataSourceAnalysis规则,转换createtable和insertintoTable操作计划。
核心接口:org.apache.spark.sql.sources.interfaces
这个接口内的抽象几乎满足了现有很多需求,如果不满足,可以在此自定义,并在下面关键地方实现自己的逻辑即可扩展。
创建表核心逻辑
1、 SparksqlParser.visitCreateTable传入schema、