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.