Hive总结

来源:互联网 发布:金蝶软件报价 编辑:程序博客网 时间:2024/05/14 21:47

Hive常用函数参看:http://blog.csdn.net/wisgood/article/details/17376393


hive的牛帖子:http://blog.csdn.net/haojun186/article/details/7977565


个人总结:

区别 like,rlike,regexp,regexp_extract:

      like:匹配2014.10.22,来自sm.cn的pv,uv数

            select count(dt)pv,count(distinct clientid)uv from pv_partitioned where dt='2014-10-22' and url like '%sm.cn%';

      rlike:

           select count(dt)pv,count(distinct clientid)uv from pv_partitioned where dt='2014-10-22' and url rlike '^http://3g.zhuanjia.xywy.com/yyzj(-(\\w)+){3}.htm\'

     regexp:

           select count(dt)pv,count(distinct clientid)uv from pv_partitioned where dt='2014-10-22' and url regexp '^http://3g.zhuanjia.xywy.com/yyzj(-(\\w)+){3}.htm\'

    事实证明regexp与rlike基本上可以通用,至少我目前认为是这样的。还希望大神指教。

     regexp_extract:

           select count(dt)pv,count(distinct clientid)uv from pv_partitioned where dt='2014-10-22' and url regexp_extract(url,'^http://3g.zhuanjia.xywy.com/yyzj(-(\\w)+){3}.htm\',0)!='';

     真心话平常用的regexp_extract和like比较多,用regexp_extract是因为现在的很多url地址比较奇怪,在html结尾后还是会有很多奇怪的参数(暂且这么认为),如果直接用rlike或regexp匹配的话,往往拿到的数据不太对。用的like多,更多的是因为简单。

     关于w之前的“\\”,则是在hive中需要转义,在此需要提醒大家的是,在参数中往往会有“?”,则在写hive语句的时候也是需要转义的,需要用“\\?”。




left semi join的用法和left outer join的用法:

  left semi join成为左半开连接,是用来很好的替代hive中不支持in操作的。左半开连接会返回左边表的记录,前提是其记录对于右边表满足on语句中的判定条件。需要注意的是,在select和where语句中不能引用到右边表中的字段。

  select count(dt)pv,count(distinct clientid)uv from pv_partitioned_rc a left semi join (select clientid from pv_partitioned_rc where dt='2014-10-14' and redoman like '%sm.cn%' and regexp_extract(url,'^http://3g.zhuanjia.xywy.com/plus-list-(\\w)+.htm',0)!='')b on a.clientid=b.clientid

 

 left outer join称为左外连接,在这种join连接操作中,join操作符左边表中符合where字句的所有记录将会被返回,join操作符右边表中如果没有符合on后面连接条件的记录时,那么从右边表指定选择的列的值将会是null.





hive优化:

可以在进行查询时,尽量对SQL进行优化,

1  在用join作表连接时,不使用select * fom,只select需要的字段(如:select  cn , jewel_total ,dt fom ….)

2  在查询时间跨度较大(如时间跨度为1年以上)的语句时,在语句的最前面加上set mapred.map.tasks=5; set mapred.reduce.tasks=1;

3  尽量不要开多个窗口同时进行查询,尽量保持在4个以下;

4  类似 select cn from tlbb.logon_log where dt<=’2015-08-20’ 这种基本算是全表搜索的语句不建议使用,因为天龙、刀剑等项目年份久远,基本都有6年以上的数据量,应该加上dt>’yyyy-mm-dd’的条件作一下限制






0 0