使用 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 对大型数据框进行非规范化的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 中的非标准化数据框

更新Cassandra中的大型非规范化数据

Symfony 2 使用自定义非规范化器对嵌套对象进行非规范化

如何在 javascript 中最有效地对规范化数据进行非规范化

神经网络中预测数据的非规范化

非规范化数据