如何使用猪拉丁语“更新”列
Posted
技术标签:
【中文标题】如何使用猪拉丁语“更新”列【英文标题】: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 中。我希望我知道一种更清洁的方式。 【参考方案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 ..;
【讨论】:
以上是关于如何使用猪拉丁语“更新”列的主要内容,如果未能解决你的问题,请参考以下文章
如何创建用于猪拉丁语和 izzle 翻译的代码以及同时应用它们的代码?