在配置单元或Pig中创建序列号

时间:2014-09-03 13:26:26

标签: hadoop hive apache-pig hiveql

我面临数据转换问题: 我在这里有3列的表:客户端,事件,时间戳。 我基本上希望根据时间戳为给定客户端的所有事件分配序列号,这基本上是"序列"我在下面添加的专栏。

Client  Event   TimeStamp                Sequence
C1      Ph      2014-01-30 12:15:23      1
C1      Me      2014-01-31 15:11:34      2
C1      Me      2014-01-31 17:16:05      3

C2      Me      2014-02-01 09:22:52      1
C2      Ph      2014-02-01 17:22:52      2

我无法弄清楚如何在hive或Pig中创建此序列号。你有什么线索吗?

提前致谢!

纪尧姆

2 个答案:

答案 0 :(得分:4)

将所有记录放入包中(通过分组全部),通过TimeStamp字段对包内的元组进行排序,然后使用Enumerate函数。

下面的内容(我没有执行代码,因此您可能需要稍微清理一下):

// assuming input contains 3 columns - client, event, timestamp
input2 = GROUP input all;
input3 = FOREACH input2
         {
             sorted = ORDER input BY timestamp;
             sorted2 = Enumerate(sorted);
             GENERATE FLATTEN(sorted2);
         }

答案 1 :(得分:0)

我们最终通过以下方式修改了枚举源,并且效果很好:

public void accumulate(Tuple arg0) throws IOException {
nevents=13;
i=nevents+1;
DataBag inputBag = (DataBag)arg0.get(0);
  Tuple t2 = TupleFactory.getInstance().newTuple();
for (Tuple t : inputBag) {
  Tuple t1 = TupleFactory.getInstance().newTuple(t.getAll());
  tampon=t1.get(2).toString();
  if (tampon.equals("NA souscription Credit Conso")) {
    if (i <= nevents) {
      outputBag.add(t2);
      t2=TupleFactory.getInstance().newTuple();
     }
    i=0;
    t2.append(t1.get(0).toString());
    t2.append(t1.get(1).toString());
    t2.append(t1.get(2).toString());
    i++;
   }
   else if (i < nevents) {
    t2.append(tampon);
    i++;
   }
   else if (i == nevents) {
    t2.append(tampon);
    outputBag.add(t2);
    i++;
    t2=TupleFactory.getInstance().newTuple();
   }
  if (count % 1000000 == 0) {
    outputBag.spill();
    count = 0;
  }
  ;
  count++;
}
if (t2.size()!=0) {
  outputBag.add(t2);
}
}