如何提取pig中tuple/bag的最后一个元素?

mwyxok5s  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(520)

如何提取pig中tuple/bag的最后一个元素?
我在pig的一个关系中有一个字符串。
我想提取这个字符串的最后一个标记作为一个新字段。我该怎么做?
例子:
我们的关系是

(id:int, description:chararray)

描述字段是一个长字符串,该字符串的最后一个标记是id为的人的姓氏,例如。

(123,' here is the description for John Edwards');

我想要的是从这个字符串中提取姓氏作为一个单独的字段,并具有以下关系

(id:int, lastname:chararray)

即。

(1234,'Edwards')
bcs8qyzn

bcs8qyzn1#

由于问题是如何找到袋子中的最后一个元素,您可以使用下面的代码,该代码适用于稍微不同的数据集:

{"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"}]}

pig脚本如下所示:

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;
ggazkfy8

ggazkfy82#

对于解决方案,让我们假设您的输入关系称为数据

data = LOAD 'data' AS (id:int, description:chararray);

lastName = FOREACH data GENERATE id,REGEX_EXTRACT(description,'\\s([A-Za-z]+)$',1) as lastname:chararray;

这将从有问题的字符串中提取最后一个单词。

相关问题