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

Apache pig 在Apache Pig中将分隔列扩展为动态值,apache-pig,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 A = LOAD '...' ...; B = FOREACH A GENERAT

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

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
A = LOAD '...' ...;
B = FOREACH A GENERATE ID, Name, REGEX_EXTRACT(info, 'quality=([0-9]+),', 1) AS Quality;
我试图提取的是age: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
为了获得质量,我做了如下工作:

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
A = LOAD '...' ...;
B = FOREACH A GENERATE ID, Name, REGEX_EXTRACT(info, 'quality=([0-9]+),', 1) AS Quality;

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

您可以使用

REGEX\u EXTRACT
/
REGEX\u EXTRACT\u ALL
,但这很麻烦。由于任何顺序都可以有一到三个age/rank/foo字段,因此对于包含所有3个字段的实例,需要6个正则表达式来覆盖所有置换,对于包含2个字段的实例,需要6个正则表达式,对于单个字段,需要3个正则表达式


从中可以得到年龄/等级/foo的11个字段(3字段提取中有6个字段,2字段提取中有4个字段,单字段提取中有1个字段)。对于每个年龄/等级/foo,选择一个非空的作为结果(例如,
(foo1不是空的?foo1:(foo2不是空的?foo2:(foo3不是空的?foo3:…))作为foo_final
)。

为什么不能继续使用
REGEX_EXTRACT
REGEX_EXTRACT_ALL
?这就是我要做的。@WinnieNicklaus我认为这是不可能的,因为键会改变位置。例如,对于一个文件,它可能是年龄:等级:foo,1:2:3,但下一个可能是等级:年龄:foo,2:1:3。除非我想的太多了……也许有一些黑魔法可以让你用正则表达式得到你想要的,可能用一些不同的。但最具可读性的方法是编写一个UDF。如果你真的想留在Pig里,你可以试着用
regex
标记这个问题,并强调它的这一方面。听起来很棒。谢谢