描述
在程序中使用alter方式动态增加Hive的字段,但是Hive字段增加之后,使用Spark向Hive写数据,此时修改了Hive元数据表中的table属性,使得Hive和Impala两边的元数据不一致,然后新增的数据 就没有办法同步到Impala中。
初步解决方案
在服务器中通过 hive-site.xml Hive配置,找到元数据的存储地址。
<!-- ConnectionUserName 是元数据存储的实例的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>username</value>
</property>
<!-- ConnectionURL 是存储实例的地址和密码 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://connectURL/password</value>
</property>
再tbls表中可以查到sd_id,然后通过sd_id在 sds 中查找table对应的cd_id
首先通过 tbls 查找table对应的tbl_id, 然后通过tbl_id在 table_params 中查看table属性.如下图:
最主要的是画红线的地方,是通过Spark向Hive存储数据之后,table属性被Spark修改了,使得元数据没有同步到Impala。
下面就是体现专业行的时候了????
可以点开 spark.sql.sources.schema.part.5,按照一下格式直接在后边追加没有同步过来的元数据字段…
{“name”:“update_reminder”,“type”:“string”,“nullable”:true,“metadata”:{“HIVE_TYPE_STRING”:“string”}}
最后在Impala中通过,refresh就可以将数据刷新过去
refresh impalatable;
具体怎么解决过两天再说吧????这两天事儿有点多