pig脚本总结

 1 如果在宏中需要使用UDF,无需再宏中注册和定义该UDF,直接使用即可。因为pig的宏相当于直接将宏的代码与调用该宏的代码合并之后执行。


2 宏中传入的字段解析错误。比如传入的日期字段,会莫名其妙的被解析为1970年的时间,比如:

  

define public_flow_and_usernum_statistic (grouped_data,sel_data,date_time ,divide_num) returns statisticed {
      
    $statisticed = foreach $grouped_data{
        
    analysis_3g_data_filter = filter $sel_data by data_type =='3g';

    analysis_4g_data_filter = filter $sel_data by data_type =='4g';  
    
    generate $date_time as (data_time:chararray), FLATTEN(group), usernum_all as usernum_all......
    };
    };
 此时传入的日期字段会被解析为 1970年,需要将 $date_time写成 '$date_time', 放到单引号里面。

3  如何用Pig设置map端的并行度.我们知道,无法通过PARALLEL来设置Pig job map端的并行度,但是,有没有什么办法可以间接实现这一点呢?在Java编写的MapReduce程序中,通过FileInputFormat.setMinInputSplitSize()来间接更改map的数量,其实它就与设置 mapred.min.split.size 参数值的效果是一样的。在Pig中,我们是可以通过set命令来设置job参数的,所以,我们如果在Pig脚本的开头写上:

set mapred.min.split.size 2147483648;
将使得对map来说,小于2G的文件将被作为一个split输入,从而一个小于2G的文件将只有一个map。假设我们的Pig job是一个纯map的job,那么,map数的减少将使得输出文件的数量减少,在某些情况下,这种功能还是很有用的。
注意:上面的命令中,set的参数的单位是字节,所以2G=2*1024*1024*1024=2147483648。

Pig调用现存的静态Java方法。对于一件极其简单的操作的,例如,把一个编码过的URL解码,如果我只想临时用一下这个功能,那么我还要去写一个UDF,累不累啊?我们知道,java.net.URLDecoder.decode 这个静态方法已经实现了URL解码功能:

static String decode(String s, String enc) 
使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码


如何在pig中调用静态方法?

DEFINE DecodeURL InvokeForString('java.net.URLDecoder.decode', 'String String');
A = LOAD 'a.txt' AS (url: chararray);
B = FOREACH A GENERATE DecodeURL(url, 'UTF-8');
STORE B INTO 'url';
需要注意的是:只能调用静态方法,并且此调用比同样的UDF实现速度要慢,这是因为调用器没有使用Accumulator或Algebraic接口。根据 这位 兄台的测试,百万条的记录规模下,调用Java静态方法比UDF大约要慢一倍。



 


你可能感兴趣的:(pig)