Spark.saveAsTable读不到Hive动态增加字段

描述

  在程序中使用alter方式动态增加Hive的字段,但是Hive字段增加之后,使用Spark向Hive写数据,此时修改了Hive元数据表中的table属性,使得Hive和Impala两边的元数据不一致,然后新增的数据 就没有办法同步到Impala中。

初步解决方案

在服务器中通过 hive-site.xml Hive配置,找到元数据的存储地址。


<property>
  <name>javax.jdo.option.ConnectionUserNamename>
  <value>usernamevalue>
property>


<property>
  <name>javax.jdo.option.ConnectionURLname>
  <value>jdbc:mysql://connectURL/passwordvalue>
property>

再tbls表中可以查到sd_id,然后通过sd_id在 sds 中查找table对应的cd_id
  首先通过 tbls 查找table对应的tbl_id, 然后通过tbl_id在 table_params 中查看table属性.如下图:
Spark.saveAsTable读不到Hive动态增加字段_第1张图片
最主要的是画红线的地方,是通过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;



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



2019-05-09

最终解决

再网上找到了这个连接 https://issues.apache.org/jira/browse/SPARK-21841

和我的情况很像,出现这个问题的原因是存储的数据格式有差别。使用Spark.saveAsTable()对数据存储之后,Hive元数据表的tbls中会增加一些字段

spark.sql.partitionProvider	catalog
spark.sql.sources.provider	parquet
spark.sql.sources.schema.numPartCols
spark.sql.sources.schema.numParts
spark.sql.sources.schema.part
spark.sql.sources.schema.partCol

spark.sql.sources.provider 字段指定Hive的数据格式是parquet,在这种格式下,Spark会直接从 spark.sql.sources.schema.part 中读取元数据信息,但是这种格式下Hive通过alter更新的字段没有写入到 spark.sql.sources.schema.part 里边,所以在Spark读元数据的时候会少字段。此次解决的方法是,先删除元数据中在tbls表里边以spark.sql开头的字段,然后在Spark.saveAsTable()的时候指定format,最终就解决了这个问题。

data.write.saveAsTable(‘shuangshi_dh.dot_analysis’, mode=“append”, format=“hive”, partitionBy=“dt”)

你可能感兴趣的:(数据库)