看了一些文章,对Hive正则描述不够全,因此发一篇。
过滤过程括号中的文字,支持多个括号
select regexp_replace( '广东省深圳合作(11-1222公里)某饿了团','([!^(]+)([\\w*\\W*]+)([$)])','') select regexp_replace(regexp_replace( '广东省(公里)深圳合作(61-13020公里)某饿了团','([!^(]+)([\\W*]+)([$)])',''),'([!^(]+)([\\w*\\W*]+)([$)])','')
得到_后面的数字
select regexp_replace('dsfsdfsd1das_23456','[^_]([^0-9]+)','')
连接同时判断空select concat(nvl(f1,''),';',nvl(f1,''),';',nvl(f3,'')) from test_dt
Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在
ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
可以被重写为:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
not in查询
如果要查询当天登陆的老用户(这里假设非当天注册用户就是老用户),需要用not in查询,hive sql如下:
select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is null;
如果login表和regusers表按天分区,字段是dt,那么查询2013年1月1号当天登陆的老用户,hive sql如下:
select login.uid from login day_login left outer join
(select uid from regusers where dt='20130101') day_regusers
on day_login.uid=day_regusers.uid where day_login.dt='20130101' and day_regusers.uid is null;
把上传的文件传到表里,同时到分区(注意权限就好)
LOAD DATA LOCAL INPATH '/path/to/local/files' OVERWRITE INTO TABLE test PARTITION (country='CHINA')
言归正传
1。regexp_extract
语法: regexp_extract(stringsubject, stringpattern, intindex)
返回值:string
说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
第一参数: 要处理的字段
第二参数: 需要匹配的正则表达式
第三个参数:
0是显示与之匹配的整个字符串
1 是显示第一个括号里面的
2 是显示第二个括号里面的字段...
注意,在有些情况下要使用转义字符(双斜杠了‘\\’)。
正则匹配字符解释:
^ 表示开头
$ 表示结尾
. 表示任意字符
* 表示任意多个
2。手机号清洗:
regexp_replace(mobile,'[^0-9]','') regexp '1[0-9]{10}'
返回true,则为好的手机号。
3。其他两个函数split 和parse_url
1、元字符匹配
(.) 表示匹配除换行符以外的任意字符。
(\w) 表示匹配字母、下划线、数字或汉字(\\W)。
(\d) 表示匹配数字
(\s) 表示匹配任意的空白符
([ ]) 表示匹配方括号中任一字符
([^匹配内容]) 表示匹配方括号中任一字符
2、位置匹配
(^) 表示匹配字符串的开始,空值:^$
($) 表示匹配字符串的结束
(\b) 表示匹配单词的开始或结束。
(\B) 表示匹配非单词的开始或结束
3、频率匹配
(*) 表示匹配重复0次或多次
(+) 表示匹配重复一次或更多次
(?) 表示匹配重复0次或1次
({n}) 表示匹配重复n次
({n,}) 表示重复n次或更多次
({n,m}) 表示重复n到m次
hive 12T在3T前
select UDFtt,CARRIERtt,equ_name
from ods_approval_transportation where engagementtttt_id='24'
group by UDFtt,CARRIERtt
order by UDFtt,desc,CARRIERtt,cast(regexp_replace(equ_name,'T','') as int) asc
以后还会编辑补充,欢迎大家来撩!请叫我雷锋!