事情起因:
????????????????生产环境新接了一张表,该表的处理过程是 上游将数据推送至kafka,然后flink消费kafka的数据,flink直接将消费的数据写到hdfs上指定的hive表空间下面,写入完成后通过msck repair table table_name修复一下表,即可在hive和impala中正常显示。
? ? ? ? ? ? ? ? 但问题出现在flink写入表的时候,代码中的属性名称和hive表中的属性名称不匹配,即代码中叫value,而hive建表时叫value2。此时数据正常存放到hdfs上的hive表空间下面,但数据在hive中查询时value2字段显示为NULL,impala中可以正常显示具体的值。
解决办法:
????????????????该表的存储压缩格式是parquet的,在解决过程中尝试新建备份表,通过insert into select 源表的方式,或者是create table as select的方式,均无法在新建表中查询到具体的数据,同时在impala中也不再显示数据。
????????????????最后通过添加了set参数,即可在hive原表中显示数据,命令为:
set parquet.column.index.access=true
原因是:Impala是以序号形式读取parquet,而Hive是以列形式读取parquet 。
最后:
? ? ? ? ? ? ? ? ? 问题已经定位并且解决,但作为开发人员之外的人还是无法看到这个结果。所以后续还是需要修改hive表结构,使其代码中的属性名和hive表的字段名相对应。
写在最后:
? ? ? ? 1.所有写到hdfs上的内容都需要进行匹配(目前仅测试了parquet格式下的),包含flink、spark或者是sqoop等,如果导入的数据的列名与Hive建表时定义的列名不一致,会导致Hive中查询到数据为null,因为Hive默认使用列名来访问Parqeut数据文件,可以通过参数?set parquet.column.index.access=true?来修改访问方式。
? ? ? ? 2.在Hive和Impala中,默认访问Parquet数据文件的方式不一样,Hive是以列名,Impala是以位置,这一点需要注意。
|