我需要以下场景的逻辑,需要使用Pig脚本来实现。任何人都可以帮助提供一些如何做到这一点的想法。
输入包含列groupName,其中包含一些其他数据和未知数据。这些数据需要用以前的记录数据代替。
输入:
id,groupName
123,casc0001
124,casc0002
125,sale0001
126,unknown
127,nave9876
128,casc0001
129,sale0002
130,others
131,casc0004
132,unknown
133,unknown
134,others
135,nave1234
输出:
123,casc0001
124,casc0002
125,sale0001
126,sale0001
127,nave9876
128,casc0001
129,sale0002
130,sale0002
131,casc0004
132,casc0004
133,casc0004
134,casc0004
135,nave1234
在上面的输入126中,未知将被替换为125,sale0001。 130,其他人需要被129,sale0002取代。 132,未知133,未知134,其他用131替换,casc0004。
- 编辑 -
我在Pig尝试了铅功能。但它仅用于一次比较n行。这完全无法解决这个问题。
另一种有效的逻辑,但寻找优化的逻辑。
Cogroup for the same data set (like Dataset and Dataset_self)
-Filter Dataset.id=Dataset_self.id or Dataset_self.groupname='others' or Dataset_self.groupname='unknown'
-Generate IdDiff like (Dataset_self.id-Dataset.id), CASE when id=id then ( id, group) else (id_self,group)
-Foreach (group id){
ordered = order by id,diff,group;
limited = ordered limit 1;
generate limited ;
}
答案 0 :(得分:0)
在像hadoop这样的分布式系统上,这将是一个复杂的问题,特别是你的文件将在节点之间分割。在你的情况下,如果126恰好是新拆分中的第一条记录。然后,您将需要跟踪最有可能在不同节点上的先前文件拆分。让我们说你想出了一个MapReduce程序来实现这一点,在所有可能的情况下,这将是一种非常缓慢和低效的方法。如果您在单个节点系统中,输入格式的splittable属性为false,并且reducers的nuber设置为1,则解决方案可能更简单。 在这种情况下,您几乎可以认为传统的数据库(如Oracle或Terra数据)可能更适合您的问题,因为您可以随时使用领先或滞后功能,这可以用来完全满足您的需求。