4

我的关系中的一列包含分隔值(例如 csv),我想将它们分解为这些值,以便我在关系中为每个值都有一个条目(与其他具有原子值的列相结合)。例如,如果我有以下数据:

SomeID|Age|CommaSeperatedNames
1     |23 |Steve,Joe,Bob
2     |26 |Dan,Mike,Tom

我希望得到的关系包含:

SomeID|Age|Names
1     |23 |Steve
1     |23 |Joe
1     |23 |Bob
2     |26 |Dan
2     |26 |Mike
2     |26 |Tom

这可以仅使用 PigLatin 和内置/piggybank UDFS 来完成吗?注意:我有一个涉及我编写的 UDF 的 hacky 解决方案,我想知道这是否可以仅使用 Pig。

4

1 回答 1

5

TOKENIZE会把你的名字分成一个袋子。然后,如果你FLATTEN在包上,它会一行一行地把它分开。如果TOKENIZE没有标记你想要的方式(它应该可以用逗号很好地工作),你可能必须编写某种 UDF 来写出一个包。

A = LOAD ... USING PigStorage('|') AS (SomeID, Age, Names);    
B = FOREACH A GENERATE SomeID, Age, FLATTEN(TOKENIZE(Names)) as Name;
C = STORE B INTO ...;
于 2011-08-25T18:57:42.377 回答