我有一些有趣格式的数据。就像这样:
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)
答案 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
)。