张杰部落格
博客信息

查询hbase映射到Hive表的诡异问题及总结

发布时间:『 2017-12-27 14:12』  博客类别:Hadoop/Spark  阅读(1352) 评论(0)

hive中dmp_device_info为映射到hbase中的dmp:device_info表,表结构如下:

CREATE EXTERNAL TABLE if not exists dmp_device_info(
         device_id_md5  string,
         device_type int,
         appids map<string,string>,
         tags map<string,string>,
         device_sources map<string,string>,
         update_time bigint
  )
 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
 WITH SERDEPROPERTIES('hbase.columns.mapping' = ':key,b:dt,a:,t:,s:,:timestamp')
 TBLPROPERTIES('hbase.table.name' = 'dmp:device_info');

dmp:device_info表结构:

列族列名
rowkey(行键)device_id_md5(32)
bdt
aappid...  值为列名,1为列的值
ttag... 值为列名,1为列的值
sdevice_source...值为列名

appids,tags,device_sources都是映射了一个列族的数据,列族里面的列名为该字段的值。比如说在hive里面查询这三个字段的值:

select appids,tags,device_sources from dmp_device_info limit 1;
结果:
{"366304":"1","372420":"1","388550":"1"}   {"r60":"1"}  {"103":"1"}
①诡异点:当去查无标签的数据时,条件里面或返回字段里面只有size(tags) = 0 时,结果会无数据
#假如总数为 100 有标签为 80 无标签的为 20 
select count(1) from dmp_device_info where size(tags) = 0;
结果为:0
select size(tags),tags from dmp_device_info where size(tags) = 0;
结果为无数据。
但当加上其它有数据的条件或返回字段时,却能查出数据来:
#假如来源为101的无标签数据为10
select count(1) from dmp_device_info where size(tags) = 0 and device_sources['101'] = '1';
结果:10
select tags,size(tags) from dmp_device_info where size(tags) = 0 and device_sources['101'] = '1'  limit 1;
结果:
{}      0
②诡异点:count或sum聚合运算时,如果带上size(tags) = 0 的判断,结果会不一样
select count(1) from dmp_device_info;
结果:100

select count(1),sum(case when size(tags) > 0 then 1 else 0 end) from dmp_device_info;
结果:80 80

#一开始怀疑count和sum一起使用有问题,为什么都没加条件,count的值会改变???,心中一万个草泥马在奔腾。

经过几轮验证得出初步结论:

(这可以理解为hbase的BUG,反正草泥马一直没有停,这完全颠覆了对SQL的理解)

当查询hbase的映射表时,如果select语句中返回的字段或者条件里用到的字段,比如a,b,c等等,当a,b,c的值在hbase中同时为空时,在查询的时候,这一行就被忽略了!

所以在统计或查询数据的时候,一定要加上一个每一行记录都有的一个字段。

比如:

#device_type在hbase表中条件记录都有值
select count(device_type) from dmp_device_info where size(tags) = 0;
结果:20


关键字:   hbase  
评论信息
暂无评论
发表评论
验证码: 
Powered by IMZHANGJIE.CN Copyright © 2015-2022 粤ICP备14056181号