在Apache Pig中将分隔列扩展为动态值

时间:2014-05-29 14:52:16

标签: apache-pig

我有一些有趣格式的数据。就像这样:

ID    Name    Info
1     Joe     quality=82,activity=23,age:rank:foo,21:0/1:30
2     Bob     activity=32,age:foo,22:31,quality=43
3     Mary    foo:age:rank,24:23:1/1,quality=62,activity=14

我想要提取的是年龄:rank:foo数据,表示为:

age:rank:foo,(age value):(rank value):(foo value)

对于每个记录,他们可能会或可能不会拥有这些键/值中的部分或全部,并且它们可以按任何顺序排列。我正在尝试转换数据,因此我得到以下内容:

ID    Name    Quality  Age    Rank    Foo
1     Joe     82       21     0/1     30
2     Bob     43       22     NULL    31
3     Mary    62       23     1/1     24

为了获得质量,我正在做这样的事情:

A = LOAD '...' ...;
B = FOREACH A GENERATE ID, Name, REGEX_EXTRACT(info, 'quality=([0-9]+),', 1) AS Quality;

但我不知道如何将奇怪的非均匀键/值映射转换为列。有什么建议? (并且我不能让他们以更好的格式向我发送数据:P)

1 个答案:

答案 0 :(得分:1)

您可以使用REGEX_EXTRACT / REGEX_EXTRACT_ALL,但这很麻烦。由于任何顺序都可以有一到三个年龄/等级/ foo字段,因此对于具有所有3个字段的实例,需要6个正则表达式来覆盖所有排列,对于具有2个字段的实例,需要另外6个,对于单个字段,需要3个以上。

你可以从中获得11个年龄/等级/ foo的字段(3个字段提取6个,2个字段提取4个,单个字段提取1个)。对于每个年龄/等级/ foo,选择一个非空的结果(例如(foo1 is not null ? foo1 : (foo2 is not null ? foo2 : (foo3 is not null ? foo3 : ... ))) as foo_final)。