0

我目前有以下猪脚本(为简洁起见,列列表被截断):

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 连接到路径中。

4

2 回答 2

0

实际上,我已经向 MultiStorage 模块提交了一个补丁,以允许拆分多个元组字段,而不仅仅是一个,从而生成动态输出树。

https://issues.apache.org/jira/browse/PIG-3258

它还没有引起太多关注,但我在生产中使用它没有问题。

于 2013-04-17T14:11:33.017 回答
0

MultiStorageUDF 没有设置为在两个不同的字段上划分输入,但这本质上就是您正在做的 - 的用途只是SPLITMultiStorage两个参数进行模拟。在这种情况下,我建议以下内容:

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,并将它们移动到具有您喜欢的任何结构的适当位置。

不是最优雅的解决方法,但它可以为您工作。需要注意的一件事是您在密钥中选择的分隔符可能不允许(它可能只是字母数字)。此外,您将被输出数据中的那个额外字段卡住。

于 2013-03-07T20:40:56.487 回答