更多信息https://blue-shadow.top/
附书代码Github工程:https://github.com/Shadow-Hunter-X
Pig和Hadoop都是Java编写的。Java也是编写UDF的原生语言,但通过Java进行编写需要通过编译打包成Jar包后进行部署,过程是很繁琐的。但通过Python编写UDF是很方便快捷的,至少在功能测试阶段是这样很方便
pig_util模块说明
对于pig_util模块可以去安装Pig的目录下获取。Hello World例子,大家应该都会感觉很亲切,所以先以Hello World程序开始说明。在这个Hello World例子中只是单纯的输出数据,并没有使用Pig传递的数据。
- 编写python脚本,脚本名为hello_world.py。
from pig_util import outputSchema
@outputSchema('word:chararray') # 使用outputSchema装饰器
def hello_world():
return "hello world"
(2)进入Grunt中调用Hello World UDF。
(base) root@test_data# pig -x local
-- 1注册Python脚本,通过输出的的信息,判断成功的注册Python脚本
grunt> REGISTER /home/hadoop/test_data/hello_world.py using streaming_python as hello_udf ;
-- 2加载数据
grunt> movies_data = load '/home/hadoop/test_data/movies.csv' using PigStorage(',') as (movieId:chararray, title:chararray, genres:chararray) ;
grunt> movies_10 = LIMIT movies_data 10 ;
-- 3调用Python的udf
grunt> movies_10_hello = FOREACH movies_10 GENERATE hello_udf.hello_world() ;
grunt> dump movies_10_hello ; -- 输出10个hello world,如下所示
2019-09-26 20:10:45,505 [MainThread] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
(hello world)
(hello world)
(hello world)
Pig调用Python UDF
在通过前一小节对pig_util.py使用实际并没有数据操作,只是演示了一个处理流程。这一节将进行演示,使用Python UDF操作Pig数据。在使用Python脚本时需要指定解释器,支持两种Jpython和C Ptyhon。
使用Jython:register '/path/to/pigudf.py' using jython as myfuncs;
使用C Python:register '/path/to/pigudf.py' using streaming_python as myfuncs;
对Movies数据进行操作。由于电影名中包含出品年份,像这样Toy Story (1995)。现在使用Python将影名和年份拆开,后计算至今出版了多少年。
from pig_util import outputSchema
from datetime import datetime
import re
@outputSchema('title:chararray')
def parse_title(title):
............