描述

  在程序中使用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属性.如下图:
Hive动态增加字段,数据未同步到Impala
最主要的是画红线的地方,是通过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;



具体怎么解决过两天再说吧????这两天事儿有点多

相关文章: