一:python
先记下官方的一个极经典例子
#######################
# Data Type Functions #
#######################
#collectBag- collect elements of a bag into other bag
#This is useful UDF after group operation
@outputSchema("y:bag{t:tuple(len:int,word:chararray)}")
def collectBag(bag):
outBag = []
for word in bag:
tup=(len(bag), word[1])
outBag.append(tup)
return outBag
数据类型的传入传出:pig里的bag对应到python的list,tuple对应到python的列表,当然列表里可以包含list
1 pig传入python,设pig传入一个bag B,里面含有很多tuple T,则传入python后都变成一个list B了,如果要访问B的第一个元组则,用下标B[0],如果要访问B的第一个元组T的第一个元素,则用下标B[0][0]。另外,B里面还可以包含bag(其实是tuple T 包含的),设T里包含bag A,A有很多个tuple Ta,假设A在tuple T 的第3个索引(从0开始数),则访问B的第一个T里A的第一个tuple的第一个元素方法是 B[0][3][0][0]。
2 从python 传出到pig,简单的数据类型好说,下面只说传出bag的情况(也即输入一个bag给python的udf处理,udf处理完以后再把处理完的bag扔回pig,两个bag的结构可以不一样),bag对应到pig里是一个list所以outBag=[]这个固定在udf代码第一行,return outBag这个固定在udf代码最后一行。pig里bag的tuple对应到python的tuple(列表,列表不同于list,列表不能append,也不能修改,其实看成一个字符串都可以,列表和简单数据类型是python里key可以的类型,即可hash化)。所以bag每加一个tuple,udf里要有如下代码:
tup=(len(bag), word[1])
outBag.append(tup)
另外注意,pig脚本里matches后的正则表达式字符串,所有的元字符都要多加一个反斜杠。
pig中可以直接使用java中的静态函数
托管java中的静态函数(效率较低)
--invoker.pig
define hex InvokeForString('java.lang.Integer.toHexString', 'int');
divs = load 'NYSE_daily' as (exchange, symbol, date, open, high, low,
close, volume, adj_close);
nonnull = filter divs by volume is not null;
inhex = foreach nonnull generate symbol, hex((int)volume);
二,java
1) 压缩jar -cvf test.jar test
2) 解压jar -xvf test.jar test