背景
目前hudi的与spark的集合还是基于spark datasource V1来的,这一点可以查看hudi的source实现就可以知道:
class DefaultSource extends RelationProvider with SchemaRelationProvider with CreatableRelationProvider with DataSourceRegister with StreamSinkProvider with StreamSourceProvider with SparkAdapterSupport with Serializable {
闲说杂谈
接着Apache Hudi初探(二)(与spark的结合)中剩下的:
val syncHiveSuccess = metaSync(sqlContext.sparkSession, writeConfig, basePath, df.schema)
这里主要是同步到数据到hive的元数据中,如果hoodie.datasource.hive_sync.enable开启(默认是false,不开启)
则会设置hoodie.datasource.meta.sync.enable为true(默认是false,不开启),于此同时会把HiveSyncTool类加入到syncClientToolClassSet集合中,便于后续调用,当然如果设置了hoodie.meta.sync.client.tool.class,也会加入到该集合中。
如果hoodie.datasource.meta.sync.enable为true ,
会设置hoodie.datasource.hive_sync.schema_string_length_thresh为spark.sql.sources.schemaStringLengthThreshold 默认是4000
设置hoodie.meta_sync.spark.versio为当前spark的版本
设置hoodie.meta.sync.metadata_file_listing 为hoodie.metadata.enable (默认是true)
之后调用HiveSyncTool的syncHoodieTable方法来进行元数据的同步,
对于MOR表来说,会有两张表,一张是rt 表,一张是ro表,分别对应snapshot表(实时表)和读优化表
但是如果hoodie.datasource.hive_sync.skip_ro_suffix为true (默认是false),则读优化表,则不会加 ro 后缀
最后还会在spark中刷新刚才建立的表,这样才spark的查询中就能查询到插入的hudi表