SparkSql中,关于Hive表与Parquet文件的Schema转化兼容

从表Schema处理角度对比Hive和Parquet,两者主要的区别:

Hive区分大小写,Parquet不区分大小写;
Hive允许所有的列为空,而Parquet不允许所有列为空;
基于上述两点区别,在进行Hive metastore Parquet转换为SpqrkSql Parquet时,需要将两者的结构进行一致化,其一致化规则:

两者同名字段必须具有相同的数据类型,一致化后的字段必须为Parquet的字段类型,这个规则解决了空值得问题;
一致化后得schema,只包含Hive metastore中出现的字段,忽略只出现在Parquet的字段;
只在Hive metastore出现的字段设置为nullable,并加到一致化后的schema中。
关于元数据,还要注意一点——元数据的刷新。SparkSQL缓存了Parquet元数据以达到良好的性能。当Hive metaStore Parquet表转换为enabled时,表修改后,缓存的元数据并不能刷新,这时必须要手动刷新元数据。

//手动刷新元数据
sparkSession.catalog.refreshTable("table_name")

 

posted @ 2019-09-05 15:17  KamShing  阅读(1117)  评论(0编辑  收藏  举报