Apache pig 使用Pig对大型数据帧进行非规范化

Apache pig 使用Pig对大型数据帧进行非规范化,apache-pig,Apache Pig,我有一个大的ish(21GB)制表符分隔的表单数据框 DOCID_1 TERMID_1 TITLE_1 YEAR_1 AUTHOR_1 DOCID_1 TERMID_2 TITLE_1 YEAR_1 AUTHOR_1 ... DOCID_n TERMID_n TITLE_n YEAR_n AUTHOR_n 也就是说,(DOCID,TERMID)对总是唯一地标识一行。我需要的是一个数据帧,其中DOCID单独唯一地标识一行,t

我有一个大的ish(21GB)制表符分隔的表单数据框

DOCID_1    TERMID_1    TITLE_1    YEAR_1    AUTHOR_1
DOCID_1    TERMID_2    TITLE_1    YEAR_1    AUTHOR_1
...
DOCID_n    TERMID_n    TITLE_n    YEAR_n    AUTHOR_n
也就是说,(DOCID,TERMID)对总是唯一地标识一行。我需要的是一个数据帧,其中DOCID单独唯一地标识一行,termid被折叠成一个逗号分隔的字符列表。比如说,

DOCID_1    TERMID_11, TERMID_12, ..., TERMID_n    TITLE_1    YEAR_1    AUTHOR_1
...
DOCID_n    TERMID_n1, TERMID_n2, ..., TERMID_n    TITLE_1    YEAR_n    AUTHOR_n

有谁能想出一个好办法在猪身上做到这一点吗?

太好了,谢谢!有一件事:为了让你的例子发挥作用,我不得不将最后一行改为“通过doc_id加入ZNF”。那是你的打字错误吗?“一旦我弄明白了,我就接受你的回答。”凯尔。是的,谢谢你的帮助。当您按列名对别名进行分组时,它会自动将您按其分组的内容命名为
GROUP
。在ZNF=语句中,我将其重命名为doc_id。
SEMINORMALIZED = LOAD 'so.txt' USING PigStorage(',') AS (
    doc_id:chararray
    ,term_id:chararray
    ,title:chararray
    ,year:chararray
    ,author:chararray
);

KEYS = FOREACH SEMINORMALIZED GENERATE 
    doc_id
    ,term_id
;

ATTRIBUTES = FOREACH SEMINORMALIZED GENERATE
    doc_id
    ,title
    ,year
    ,author
;

ATTRIBUTES = DISTINCT ATTRIBUTES;

GROUPED = GROUP KEYS BY doc_id;

ZNF = FOREACH GROUPED GENERATE
    group AS doc_id
    ,KEYS.term_id; AS term_ids

DENORMALIZED = JOIN ZNF BY doc_id, ATTRIBUTES BY doc_id;