一提到大数据,想必大家很容易想到Hive。这里笔者将仅介绍hive分区字段为日期格式时,如何撰写对应SQL的where条件可以不会全表扫描。这里我们假设表名为tb_test,分区字段为cp,数据格式为年月日+后缀‘00’(具体见下表):

字段英文名字段中文名
usernum手机号
cp分区日期,格式如:yyyyMMdd00

假设我们现在每天都要定时执行包含这样一条SQL的demo,统计1周的用户数(需对手机号进行去重),我们这里仅列以下3种写法:

第一种写法:

select count(t.usernum)
  from (select usernum
          from tb_test
         where cp <= 2020040500
           and cp >= 2020033000
         group by usernum) t;

第二种写法:

select count(t.usernum)
  from (select usernum
          from tb_test
         where cp <= 2020040500
           and cp >=
               from_unixtime((unix_timestamp('2020040500''yyyyMMddHH') -
                             6 * 24 * 60 * 60),
                             'yyyyMMddHH')
         group by usernum) t;

第三种写法:

select count(t.usernum)
  from (select usernum
          from tb_test
         where cp <= 2020040500
           and cp >= concat(substr(date_add('2020-04-05'-6), 04),
                            substr(date_add('2020-04-05'-6), 62),
                            substr(date_add('2020-04-05'-6), 92),
                            '00')
         group by usernum) t;
对于第一种写法,想必小伙伴们都知道,这样查询时是不会扫描hive表所有的分区的,查询速度也比较快。但是对于第2种写法,我们就要注意了,该方法经过测试发现,是会扫描所有分区,所以当你查询的时间段之外的分区对应的hdfs文件有损坏或空文件时,将会报code2错误(具体位置大家可以去yarn界面查看)。但是,对于第三种写法则不会出现全表扫描情况,查询效果和第一种类似。
如有问题,欢迎关注公众号后留言,谢谢!、

阅读本文的人还看了

Spark2.2.0源码分析之通信框架
语音识别(LSTM+CTC)
大数据hive利器
BP神经网络
初识TensorFlow
GAN模型生成手写字
用TensorFlow教你做手写字识别(准确率94.09%)
OpenCV+TensorFlow实现自定义手写图像识别
深度学习(Deep Learning)资料大全(不断更新)
Storm环境搭建(分布式集群)