HIve修改字段或者增加字段后,Spark访问不生效问题

问题重现(例)

当我将数据存储格式改变,或者增加一列的时候,我习惯使用了alter table add …来实现

原来的表:
HIve修改字段或者增加字段后,Spark访问不生效问题_第1张图片

ALTER TABLE test ADD COLUMNS (weight STRING) CASCADE

加上一列weight字段后(这里使用cascade就是为了同步到hivemetastore),我用spark向表插入一个带有weight字段的表,此时抛出异常

Exception in thread "main" org.apache.spark.sql.AnalysisException:
 The column number of the existing table default.test(struct) 
 doesn't match the data schema(struct);

告诉我字段不匹配,于是我去找了元数据发现元数据中的确没有weight这一字段,难道是cascade失效了?不太可能
差元数据的步骤:

use hivemetastore;
select * from TBLS;//找到此表的TBL_ID
//找到后在TABLE_PARAMS找这张表的schema
select * from TABLE_PARAMS where TBL_ID = '691'

发现的确没有改变

在这里插入图片描述

于是去网上寻求答案
在Spark社区21841中发现了原因

原因及解决

原因就在于我们的存储格式为parquet

parquet格式时,spark会直接从上面的元数据库中寻找schema信息,但是此种格式下,hive中通过alter的方式并不能修改元数据库中的信息,所以更新就失败了,spark访问也无效

解决:
粗劣的解决办法就是update元数据库中的这一条信息,但是比较费时,
也可以将parquet格式改掉,用hive的格式也可以同步,我们因为采用parquet存储信息
所以不能轻易改变,目前只能update元数据库来实现,苦逼,如果有更好的方法,请随时评论给我
HIve修改字段或者增加字段后,Spark访问不生效问题_第2张图片

你可能感兴趣的:(Spark基础与提高,大数据学习,Hive)