gpt4 book ai didi

hadoop - 使用大型动态分组/路径存储数据

转载 作者:行者123 更新时间:2023-12-02 21:55:13 25 4
gpt4 key购买 nike

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

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 BY通过某种方式做到吗?看来我应该能够按站点ID进行GROUP BY,然后展平每一行并在该行上运行多重存储,但是我不确定如何将GROUP串联到路径中。

最佳答案

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,然后将其移动到具有所需结构的适当位置。

这不是最优雅的解决方法,但它可能完全适合您。需要注意的一件事是您可能不允许使用在键中选择的分隔符(它只能是字母数字)。同样,您将在输出数据中停留在该额外字段上。

关于hadoop - 使用大型动态分组/路径存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com