比较猪行的逻辑

时间:2015-05-21 12:05:37

标签: hadoop apache-pig

我需要以下场景的逻辑,需要使用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 ;
     }

1 个答案:

答案 0 :(得分:0)

在像hadoop这样的分布式系统上,这将是一个复杂的问题,特别是你的文件将在节点之间分割。在你的情况下,如果126恰好是新拆分中的第一条记录。然后,您将需要跟踪最有可能在不同节点上的先前文件拆分。让我们说你想出了一个MapReduce程序来实现这一点,在所有可能的情况下,这将是一种非常缓慢和低效的方法。如果您在单个节点系统中,输入格式的splittable属性为false,并且reducers的nuber设置为1,则解决方案可能更简单。 在这种情况下,您几乎可以认为传统的数据库(如Oracle或Terra数据)可能更适合您的问题,因为您可以随时使用领先或滞后功能,这可以用来完全满足您的需求。