1

我有这个模式的表:

(id: chararray, ts: long, data: chararray)

其中 ts 代表时间戳并与 UNIX 时间一起存储;

因为数据会更新,如果更新发生,ts会被修改,id不会改变。但是所有这些旧记录和新记录都将存储在 hdfs 中。

我只是想看看最新的数据,所以我这样写猪代码:

grp = GROUP table BY id;

rst = FOREACH grp {
    latest = FILTER table BY ts == MAX(table.ts);
    GENERATE latest.id AS id,
             latest.data AS data;
}

但似乎 Pig 代码不起作用,那么任何人都可以给我一个建议让这个代码工作吗?

4

2 回答 2

1

您是否尝试过按ts降序排列?

LATEST = LIMIT (ORDER table BY ts desc) 1;
dump LATEST;
于 2012-09-18T06:40:51.487 回答
0

我不确定为什么这不起作用,但编写 UDF 来做到这一点也不会太难。只需输入元组包,循环它们,然后返回具有最大时间戳的元组。然后你可以这样做:

grp = GROUP table BY id;
latest = FOREACH grp GENERATE my.udfs.LatestInBag(table);
于 2012-09-18T23:16:10.137 回答