如何在Pig中将loadhtml_content的行数传递至另一个别名?
解决Pig中将loadhtml_content行数传递到UDF的问题
首先先修正你代码里的一个小笔误:你定义的分组别名是group,但后面用了group1,这个得先统一成group,不然会运行报错。
接下来要实现把loadhtml_content的行数传入myfunc.nLog,可以分三步来做:
第一步:计算loadhtml_content的总行数
用GROUP ALL把loadhtml_content的所有行聚合成一个组,然后用COUNT统计总行数:loadhtml_total = FOREACH (GROUP loadhtml_content ALL) GENERATE COUNT(loadhtml_content) AS total_rows: long;第二步:将总行数与词频统计结果做笛卡尔积
因为loadhtml_total只有一行数据(就是总行数),我们需要把它和count(词频统计结果)做笛卡尔积,这样每一行词频数据都会带上总行数:count_with_total = CROSS count, loadhtml_total;第三步:在UDF中传入总行数
现在count_with_total里包含了词、词频和总行数三个字段,直接在nLog中引用第三个字段即可:log = FOREACH count_with_total GENERATE myfunc.nLog($0, $1, $2);
完整修正后的代码
REGISTER 'udf.py' using jython as myfunc; loadhtml = load './assignment/crawler' using PigStorage('\u0001') as (id1:chararray,url:chararray,domain:chararray,content:chararray,source:chararray,date:chararray); loadhtml_content = FOREACH loadhtml generate content; flatten = FOREACH loadhtml_content generate flatten(TOKENIZE(content)) as word; -- 这里修正了TOKENIZE的参数,原代码的line字段不存在,应该用content group = GROUP flatten by word; count = FOREACH group generate $0, COUNT($1); -- 新增计算总行数的步骤 loadhtml_total = FOREACH (GROUP loadhtml_content ALL) GENERATE COUNT(loadhtml_content) AS total_rows: long; -- 合并词频和总行数 count_with_total = CROSS count, loadhtml_total; -- 传入总行数到UDF log = FOREACH count_with_total GENERATE myfunc.nLog($0, $1, $2);
另外还要提醒你:原代码flatten步骤里的TOKENIZE(line)是错误的,因为loadhtml_content只包含content字段,这里改成了TOKENIZE(content),不然会因找不到字段而报错。
内容的提问来源于stack exchange,提问作者Derek Long
相关产品推荐
相关产品推荐

