记录一种impala列数据偏移列头的情况

写在前头:亲,以下内容仅用于个人备忘录,如需转发或看了激动了,请写明出处!

最近,公司一个项目中为了提升hive数据的查询分析性能,基于hive的元数据,引入了开源的impala技术,一开始,波澜不惊,hive表该怎么建,该怎么元数据一致性检查;impala该怎么invalidate metadata/refresh tablename都ok,没过多久,同事的一次建表操作impala数据的发生了列数据偏移,针对这个问题我觉得有意义来记录一下,具体如下:

                                                                  (图一)

                                                             (图二)

同志们应该发现情况了吧!同样的查询条件,impala的查出的数据与列头产生了偏移,hive查出的数据是正确的。

对应hive建表语句:

(图三)

由于数据在hdfs上采用的是parquet列式存储格式,想到impala对parquet的一种建表方式,如下:

CREATE EXTERNAL TABLE xxxdb.xxxtable LIKE PARQUET   'hdfs://xxx.com.cn:{port}/xxx/xxx/xxx/dt=xxx/xxx.snappy.parquet'
PARTITIONED BY (dt STRING)
STORED AS PARQUET LOCATION 'hdfs://xxx.com.cn:{port}/xxx/xxx/xxx'

对应在hive中show出来是这样的:

                                 (图四)

parquet文件本身的列顺序是这样的,与图四展示的一致:

                                                (图五)

最终,抱着试一试的态度修复、刷新元数据后impala的数据列尽然都对应上了,如下:

                                                 (图六)

                                                 (图七)

总结:

1、对于parquet文件,考虑到impala的使用,hive建表时,字段顺序尽量与parquet文件列的顺序一致,不然你在impala中使用invalidate metadata 或者refresh同步这张表的数据时,显示的数据可能就会偏移,这是由于impala加载parquet数据时,默认是依据表的列从左到右的顺序去解析数据的,如下图所示:

当然,你也可以使在使用数据时,设置PARQUET_FALLBACK_SCHEMA_RESOLUTION=NAME这个参数,让其按照字段名称来解析。如果parquet文件中有包含大写字段,请使用2.9以上的impala版本,不然大写字段无法识别。

2、注意一下hive与impala之间的来回切换,如下图所述:

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值