如何在Pig中提取元组/包的最后一个元素?
我在Pig中有一个关系字符串。
我想将此字符串的最后一个标记提取为新字段。我该怎么做?
示例:
我们的关系是
(id:int, description:chararray)
描述字段是一个长字符串,该字符串的最后一个标记是具有id的人的姓氏,例如
(123,' here is the description for John Edwards');
我想要的是从这个字符串中提取姓氏作为一个单独的字段,并具有以下关系
(id:int, lastname:chararray)
即。
(1234,'Edwards')
答案 0 :(得分:1)
对于解决方案,让我们假设您的输入关系称为数据
data = LOAD 'data' AS (id:int, description:chararray);
lastName = FOREACH data GENERATE id,REGEX_EXTRACT(description,'\\s([A-Za-z]+)$',1) as lastname:chararray;
这应该从相关字符串中提取最后一个单词。
答案 1 :(得分:0)
由于问题是关于找到包中的最后一个元素,您可以使用以下适用于略有不同的数据集的代码:
{"uid":"23423423423","payments":[{"timestamp":"2014-11-12 10:21","payment_id":1,"data":"payment 1 data"},{"timestamp":"2014-12-12 07:20","payment_id":2,"data":"payment 2 data"}]}
猪脚本看起来像这样:
data = LOAD '$INPUT'
USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json: map[]);
data = FOREACH data GENERATE
json#'uid' as uid:chararray,
json#'payments' as payments:bag{};
row = FOREACH data {
item = ORDER payments BY * DESC;
item = LIMIT item 1;
item = FOREACH item GENERATE $0 as arr:map[];
item = FOREACH item GENERATE
arr#'timestamp' as timestamp:chararray,
arr#'payment_id' as payment_id:int,
arr#'data' as data:chararray;
GENERATE uid, FLATTEN(item) as (timestamp, payment_id, data);
};
DUMP row;