如何在 Pig 中检索前一行的值

Posted

技术标签:

【中文标题】如何在 Pig 中检索前一行的值【英文标题】:How to retrieve previous row value in Pig 【发布时间】:2016-11-30 13:26:26 【问题描述】:

您好,我正在使用 Pig 来移动 HBASE 中的值。我正在尝试执行条件,如果成功,我将连接一个值,如果失败,我将连接前一行的值。 为此我尝试了下面的代码,但它不工作并抛出错误。

代码

STOCK_A = LOAD '/user/cloudera/pat.hl7' USING PigStorage('|');
data = FILTER STOCK_A BY ($0 matches '.*OBR.*' or $0  matches '.*OBX.*');
MSH_DATA = FOREACH data GENERATE ($0 == 'OBR' ? CONCAT('HL','OBR',(chararray)$1) : CONCAT('HL','OBR',(chararray)(data -1).$1)) AS Uid, $1 AS id, $5 AS result, $3 AS resultname;

错误

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 14, column 122>  mismatched input '.' expecting RIGHT_PAREN

我希望在其他行中复制该连接值,直到我到达另一个 OBR。请帮忙。

【问题讨论】:

【参考方案1】:

您不能在 Pig 本身中引用以前的行,但您可以编写一个聚合 UDF,它会接受所有行并执行所需的操作。但请记住,您还需要指定并行度 1,否则您的行将被分割成块

【讨论】:

我是猪拉丁语的初学者。你能分享我的例子,以便我可以write an aggregate UDF. 实际上,您需要实现简单的 UDF(扩展 EvalFunc),它将在全部分组后获取所有数据。但请注意,如果您有太多数据,请考虑生成一些以按其分组的键。【参考方案2】:

我认为您可以通过 Stitch、Over 和 lag 计算上一行的数据。虽然不确定效率。

【讨论】:

以上是关于如何在 Pig 中检索前一行的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pig 中使用标题(第一行)作为字段名称

如何在 Pig 中读取 csv 文件中的下一行

从 Pig 中的另一行减去一行的值

如何创建仅由前一行的值定义的行号?

ms 访问查询仅检索所需的值

如何检查新的输入行是不是与前一行(数组)冗余