【问题标题】:How to "update" a column using pig latin如何使用猪拉丁语“更新”列
【发布时间】:2011-01-13 17:06:57
【问题描述】:

假设我有以下表格可供使用:

A: { x: int, y: int, z: int, ...99 other columns... }

我现在想对此进行转换,将z 设置为NULL,其中x > y,将生成的数据集存储为B

我想这样做而不必明确提及所有其他列,因为这将成为维护的噩梦。

有简单的解决办法吗?

【问题讨论】:

  • 如果您想出答案,请用答案更新此问题。每当我现在必须做这样的事情时,我都会将 LOAD 行复制/粘贴到 FOREACH 中。我希望我知道一种更清洁的方式。

标签: hadoop apache-pig


【解决方案1】:

此 JIRA 中跟踪此问题: PIG-1693 在 foreach 中需要有一种方法来指示“以及所有其他字段”

目前我不知道有什么比照你说的做或不加载 Z 并使用 star expression 添加新列 Z 更简单的事情。

【讨论】:

  • 对不起,我错过了这个答案这么久!
【解决方案2】:

我能够通过将它们嵌套在单排袋中并在之后展平来减少一些列膨胀。

不过,这感觉有点像 hack。所以我也在研究级联,看看它是否更适合我的场景。

【讨论】:

    【解决方案3】:

    Pig 0.9 中添加了一个有助于您的场景的功能。新的项目范围运算符 (..) 允许您通过指示开始和/或结束字段名称来表示字段范围,如下例所示:

    result = FOREACH someInput GENERATE field1, field2, null as field3, field4 .. ;

    在上面的示例中,field1/2/3/4 是实际的字段名称。其中一个字段设置为空,而其他字段保持不变。

    更多详情请参阅这篇“Apache Pig 0.9 新特性 – 第 3 部分”文章:http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/

    要解决您的特定问题,您可能需要执行 FILTER 和 UNION 来组合结果。

    【讨论】:

      【解决方案4】:

      当然,您可以按列号选择列,但如果您更改任何内容,这很容易成为一场噩梦。我发现列名更加稳定,因此我推荐以下解决方案:

      当 mycol 在两个已知列之间时更新它

      您可以使用.. 来指示前导列或尾随列(或列之间)。如果您想将 'MyCol' 的值更改为 'updatedvalue',这将如何解决。

      aliasAfter = FOREACH aliasBefore GENERATE 
                   .. colBeforeMyCol, updatedvalue, colAfterMyCol ..;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        相关资源
        最近更新 更多