写在前头:亲,以下内容仅用于个人备忘录,如需转发或看了激动了,请写明出处!
最近,公司一个项目中为了提升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之间的来回切换,如下图所述: