元组中的元素到 Bag Pig 中的元组

Posted

技术标签:

【中文标题】元组中的元素到 Bag Pig 中的元组【英文标题】:Elements in Tuple to Tuples in Bag Pig 【发布时间】:2014-10-07 20:35:32 【问题描述】:

我有以下数据。

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 的略微修改版本可以工作。 (虽然,我不能在这里使用它 b/c 元组 $2 中的字母字符)

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

所以,我不确定为什么 UDF 可以与 int 一起使用,但不能与 chararray 一起使用。另外,我觉得可能有一种方法可以在不使用 UDF 的情况下做到这一点。但我不确定从哪里开始。对这里可能发生的事情有什么建议吗?

【问题讨论】:

【参考方案1】:

我想这很容易......就将元组列表更改为包而言。

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

但是,我仍然不喜欢 Python UDF。如果有人能想到的话。我全神贯注。

【讨论】:

如果您在旧版本的 pig(如 pig 0.12.0)中搜索 STRSPLITTOBAG,那么 TOKENIZE 会很有帮助。

以上是关于元组中的元素到 Bag Pig 中的元组的主要内容,如果未能解决你的问题,请参考以下文章

Python中的元组(Tuple)

在第一个元素在特定范围内的元组中查找元组列表中的最小值

从Haskell中的元组中提取第n个元素(其中n和元组被赋予参数)

python学习之第五篇:Python中的元组及其所具有的方法

python 元组操作总结

为元组中的每个元素命名,提高程序可读性