袋猪中元组的元组

时间:2014-10-07 20:35:33

标签: python hadoop apache-pig

我有以下数据。

DUMP a;
(2013-12-25 03:00:55,1899454055,(0958847,090119960,095V987,09518X))
(2013-12-25 03:02:47,1899454055,(09588,090119,0959872P,095189))
(2013-12-25 03:04:00,1899454055,(09588,0901199,09598720P,0951890))
(2013-12-25 03:04:37,1899454055,(0958,0901199,095000P,095189100))
(2013-12-25 03:07:12,3929866522,(0096703))

基本上我想要做的是分解元组$ 2中的每个元素,这样每个时间戳的元组中的每个元素都有一行。所以第1行看起来像这样。

(2013-12-25 03:00:55,1899454055,0958847)
(2013-12-25 03:00:55,1899454055,090119960)
(2013-12-25 03:00:55,1899454055,095V987)
(2013-12-25 03:00:55,1899454055,09518X)

现在我知道这样做的方法是将元组转换为一个包并展平。所以,我写了这个Python UDF。

@outputSchema("products:{t:(product:chararray)}")
def toBag(t):
     y = [(i,) for i in t]
     return y

当我尝试使用这个python UDF时,我无法打开别名错误。但是,当我使用整数时,稍微修改过的UDF版本就可以工作了。 (虽然,我不能在这里使用它在元组$ 2中的字母字符b / c)

  @outputSchema("ids:bag{t:(id:int)}")
  def splitT(ids):
      x = [(t,) for t in ids]
      return x

所以,我不确定UDF为什么使用int而不是chararray。此外,我觉得可能有一种方法可以在不使用UDF的情况下执行此操作。但我不知道从哪里开始。关于可能会发生什么的任何建议?

1 个答案:

答案 0 :(得分:0)

我想这个很容易..在将元组列表更改为包中。

 a2 = foreach  generate a time, id_no, TOKENIZE($2);

但是,我还没有与Python UDF的交易。如果有人能想到这一点。我全都耳朵。