我有一些缓慢变化的元数据实时存储在 HDFS 上。我想编写一个 pig 作业,将这些行压缩到每个键的最新行。
例如,对于这些数据(为清楚起见添加了列标题):
ts meta key
-- ---- ---
1 foo id1
2 que id2
3 que id2
4 foo id1
5 pasa id2
6 pasa id2
7 foo id1
8 pasa id2
9 pasa id2
10 pasa id2
11 pasa id2
12 hombre id2
13 foo id1
14 foo id1
15 hombre id2
16 bar id1
17 bar id1
18 bar id1
19 bar id1
20 bar id1
我希望得到输出:
15 hombre id2
20 bar id1
我刚刚开始学习 Pig Latin 的来龙去脉 - 是否有内置的方法可以在 Pig 或某个图书馆中做到这一点,还是应该考虑编写 UDF?
最佳答案
这是嵌套 foreach 的好地方:
A = LOAD '$input' AS (ts:int, meta:chararray, key:chararray);
B =
FOREACH (GROUP A BY key) {
byts = ORDER A BY ts DESC;
newest = LIMIT byts 1;
GENERATE FLATTEN(newest);
};
测试您的数据(我将其转换为制表符分隔):
(20,bar,id1)
(15,hombre,id2)
使用这种方法,即使您有两行带有最新时间戳的行,您也可以保证每个键只有一行(尽管这对您的数据可能无关紧要)。
关于apache-pig - 通过 pig 的时间戳获取最后一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18450869/