判断某个网站的前缀,并给其打上特定的标签值:
一个java代码例子如下:
- public String getTag(){
- //url文本
- String url="http://www.baidu.com.cn";
- //标签值
- String tags=null;
- if(url.startsWith("http://www.baidu")){
- tags="1";
- }else if(url.startsWith("http://www.dhx")){
- tags="2";
- }else{
- tags="0";
- }
- return url;
- }
public String getTag(){ //url文本 String url="http://www.baidu.com.cn"; //标签值 String tags=null; if(url.startsWith("http://www.baidu")){ tags="1"; }else if(url.startsWith("http://www.dhx")){ tags="2"; }else{ tags="0"; } return url; }
原来我的解决方法,是写了个UDF函数,来搞定,后来想了想使用UDF虽然比较灵活,但是侵入性比较强,过程比较繁琐,尤其是还得maven打成jar包,注册pig的udf函数,所以,便可以使用pig的replace的函数,来解决:
REPLACE函数用法:
REPLACE(str,regex,str2):
解释一下,三个参数
第一个是原始数据
第二个是匹配的正则 ,需要注意一些特殊字符需要转义, java中匹配任何字符的正则式时.*
第三个是替换后的内容
例子数据:
- 1,2,3
- 2,1,3
- 6,7,1
- 1,4,4
- 121,45,100
- 100,23,12
- 600,12,50
- 4,1,2
- http://www.baidu.com,1,2
- http://www.video.baidu.com,1,2
- http://www.souhu.com.cn,1,2
- http://www.dh.com,1,2
- http://www.es.dh.com,1,2
- http://www.baidu.com,1,2
- http://www.baidu.com,1,2
1,2,3 2,1,3 6,7,1 1,4,4 121,45,100 100,23,12 600,12,50 4,1,2 http://www.baidu.com,1,2 http://www.video.baidu.com,1,2 http://www.souhu.com.cn,1,2 http://www.dh.com,1,2 http://www.es.dh.com,1,2 http://www.baidu.com,1,2 http://www.baidu.com,1,2
需求,将第一列等于1的和以http://www.baidu开头的内容,替换成对应的中文称呼:
pig脚本如下:
- a = load '/test' using PigStorage(',');
- --其他特殊字符需要转义 最后的.*代表,替换所有内容为指定内容
- a = foreach a generate REPLACE($0,'^http:\\/\\/www\\.baidu.*','百度') , $1 ;
- --多次替换可执行多个foreach过滤
- a = foreach a generate REPLACE($0,'^1$','一') , $1 ;
- dump a;
a = load '/test' using PigStorage(','); --其他特殊字符需要转义 最后的.*代表,替换所有内容为指定内容 a = foreach a generate REPLACE($0,'^http:\\/\\/www\\.baidu.*','百度') , $1 ; --多次替换可执行多个foreach过滤 a = foreach a generate REPLACE($0,'^1$','一') , $1 ; dump a;
执行结果如下:
- (一,2)
- (2,1)
- (6,7)
- (一,4)
- (121,45)
- (100,23)
- (600,12)
- (4,1)
- (百度,1)
- (http://www.video.baidu.com,1)
- (http://www.souhu.com.cn,1)
- (http://www.dh.com,1)
- (http://www.es.dh.com,1)
- (百度,1)
- (百度,1)
(一,2) (2,1) (6,7) (一,4) (121,45) (100,23) (600,12) (4,1) (百度,1) (http://www.video.baidu.com,1) (http://www.souhu.com.cn,1) (http://www.dh.com,1) (http://www.es.dh.com,1) (百度,1) (百度,1)
这种方式,适合逻辑不是特别复杂的情况下使用,总体来看,比较简单方便易懂