我目前有以下猪脚本(为了简洁而截断列列表):
REGISTER /usr/lib/pig/piggybank.jar;
inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F')
PigStorage('\\x7F')
AS (
SITE_ID_COL :int,-- = Item Site ID
META_ID_COL :int,-- = Top Level (meta) category ID
EXTRACT_DATE_COL :chararray,-- = Date for the data points
...
)
SPLIT inputData INTO site0 IF (SITE_ID_COL == 0), site3 IF (SITE_ID_COL == 3), site15 IF (SITE_ID_COL == 15);
STORE site0 INTO 'pigsplit1/0/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/0/','2', 'bz2', '\\x7F');
STORE site3 INTO 'pigsplit1/3/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/3/','2', 'bz2', '\\x7F');
STORE site15 INTO 'pigsplit1/15/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/15/','2', 'bz2', '\\x7F');
它非常适合我想要它做的事情,但实际上至少有22个可能的网站ID,我不确定没有更多。我想基于该列动态创建拆分并存储到路径中。最简单的方法是通过MultiStorage UDF的两步使用,首先按站点ID拆分,然后加载所有这些结果并按日期拆分?这似乎效率低下。我可以通过GROUP BYs以某种方式做到这一点吗?看起来我应该能够通过站点ID进行GROUP BY,然后展平每一行并在其上运行多存储,但我不确定如何将GROUP连接到路径中。
答案 0 :(得分:0)
MultiStorage
UDF未设置为在两个不同的字段上划分输入,但这基本上就是您正在做的事情 - 使用SPLIT
只是为了模拟MultiStorage
两个参数。在这种情况下,我建议如下:
REGISTER /usr/lib/pig/piggybank.jar;
inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F')
AS (
SITE_ID_COL :int,-- = Item Site ID
META_ID_COL :int,-- = Top Level (meta) category ID
EXTRACT_DATE_COL :chararray,-- = Date for the data points
...
)
dataWithKey = FOREACH inputData GENERATE CONCAT(CONCAT(SITE_ID_COL, '-'), EXTRACT_DATE_COL), *;
STORE dataWithKey INTO 'tmpDir' USING org.apache.pig.piggybank.storage.MultiStorage('tmpDir', '0', 'bz2', '\\x7F');
然后使用一个简单的脚本检查输出,列出输出目录中的所有文件,提取站点和日期ID,并将它们移动到您喜欢的任何结构的适当位置。
不是最优雅的解决方法,但它可以适合您。需要注意的一件事是您可能不允许在密钥中选择的分隔符(它可能只是字母数字)。此外,您将在输出数据中遇到额外的字段。
答案 1 :(得分:0)
我实际上已经向MultiStorage模块提交了一个补丁,允许拆分多个元组字段而不是一个,从而产生动态输出树。
https://issues.apache.org/jira/browse/PIG-3258
它还没有得到太多关注,但我在生产中使用它没有任何问题。