使用 Pig 对大型数据框进行非规范化
Posted
技术标签:
【中文标题】使用 Pig 对大型数据框进行非规范化【英文标题】:Use Pig to Denormalize A Large Data Frame 【发布时间】:2014-04-15 17:54:57 【问题描述】:我有一个大的 (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 折叠成一个逗号分隔的 chararray 列表。例如,
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
谁能想到在 Pig 中执行此操作的好方法?
【问题讨论】:
【参考方案1】: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;
【讨论】:
太棒了,谢谢!一件事:为了让您的示例正常工作,我必须将最后一行更改为“JOIN ZNF BY doc_id”。那是你的错字吗?一旦我弄清楚这一点,我会接受你的回答。 @Kyle。是的,谢谢你的收获。当您按列名对别名进行分组时,它会自动将您分组的任何内容命名为group
。在 ZNF = 语句中,我将其重命名为 doc_id。以上是关于使用 Pig 对大型数据框进行非规范化的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2 使用自定义非规范化器对嵌套对象进行非规范化