從表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")