想象一下,我可以使用下表:
A: { x: int, y: int, z: int, ...99 other columns... }
我现在要对此进行转换,以便将z
设置为NULL
x > y
,并将结果数据集存储为B
。
我希望这样做而不必明确提及所有其他列,因为这会成为维护的噩梦。
有简单的解决方案吗?
答案 0 :(得分:2)
此问题在此JIRA中进行了跟踪: PIG-1693需要在foreach中指明“以及所有其他字段”
目前我不知道做什么比做你说或不加载Z和用star expression添加新列Z更简单。
答案 1 :(得分:0)
我能够通过将它们嵌套在单排袋中并在之后展平来放下一些柱膨胀。
不过,感觉有点像黑客。所以我也在调查级联,看它是否更适合我的场景。
答案 2 :(得分:0)
Pig 0.9中添加了一个便于您的方案的功能。新的项目范围运算符(..)允许您通过指示起始和/或结束字段名称来表示一系列字段,如下例所示:
result = FOREACH someInput GENERATE field1,field2,null as field3,field4 ..;
在上面的示例中,field1 / 2/3/4是实际的字段名称。其中一个字段设置为null,而其他字段保持不变。
“新Apache Pig 0.9功能 - 第3部分”文章中的更多细节:http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/
要解决您的具体问题,您可能需要使用FILTER和UNION来组合结果。
答案 3 :(得分:0)
当然,您可以按列号选择列,但如果您更改任何内容,这很容易成为一场噩梦。我发现列名更加稳定,因此我推荐以下解决方案:
您可以使用..
来指示前导列或尾随列(或列之间的列)。如果你想改变' MyCol'的价值,这将是如何解决的。到' updatedvalue'。
aliasAfter = FOREACH aliasBefore GENERATE
.. colBeforeMyCol, updatedvalue, colAfterMyCol ..;