PIG:标量在输出中有不止一行

Posted

技术标签:

【中文标题】PIG:标量在输出中有不止一行【英文标题】:PIG: scalar has more than one row in the output 【发布时间】:2016-03-02 06:15:20 【问题描述】:

我在 pig 中有以下代码,其中我正在检查存储在记录中的主文件中的字段(记录中的 srcgt 和 destgt),以获取另一个文件(intlgt.txt)中提到的值 338,918299,181,238 但它会引发错误如下所述。您能否建议如何在 Apache Pig 版本 0.15.0 (r1682971) 上克服这个问题。

猪码:

record = LOAD '/u02/20160201*.SMS' USING PigStorage('|','-tagFile') ;
intlgtrec = LOAD '/u02/config/intlgt.txt' ; 
intlgt = foreach intlgtrec generate $0 as intlgt;
cdrfilter = foreach record generate (chararray) $1 as aparty, (chararray) $2 as bparty,(chararray) $3 as dt,(chararray)$4 as timestamp,(chararray) $29 as status,(chararray) $26 as srcgt,(chararray) $27 as destgt,(chararray)$0 as cdrfname ,(chararray) $13 as prepost;
intlcdrs = FILTER cdrfilter by ( STARTSWITH(srcgt,intlgt::intlgt) or STARTSWITH(destgt,intlgt::intlgt) ) ;` 

错误是:

WARN  org.apache.hadoop.mapred.LocalJobRunner - job_local1939982195_0002
java.lang.Exception: org.apache.pig.backend.executionengine.ExecException:   ERROR 0: Scalar has more than one row in the output. 1st : (338), 2nd :(918299)  (common cause: "JOIN" then "FOREACH ... GENERATE foo.bar" should be "foo::bar") at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)

【问题讨论】:

请附上示例输入文件和所需的输出。 以错误消息为提示,我认为问题出在filter 语句中。更具体地说,在STARTSWITH 部分。我想应该是intlgt.intlgt 而不是intlgt::intlgt。但即便如此,我认为这不会像你想要的那样工作,因为你试图通过来自不同关系的字段进行过滤。 【参考方案1】:

当你使用时

intlcdrs = FILTER cdrfilter by ( STARTSWITH(srcgt,intlgt::intlgt) or STARTSWITH(destgt,intlgt::intlgt) );

PIG 正在寻找一个标量。无论是数字还是字符数组;但只有一个。所以猪假设你的 intlgt::intlgt 是与一行的关系。例如

的结果
intlgt = foreach (group intlgtrec all) generate COUNT_STAR(intlgtrec.$0) 

(这将生成单行,包含原始关系中的记录数)

在您的情况下, intlgt 包含不止一行,因为您尚未对其进行任何分组。 根据您的代码,您正在尝试查找两端都有 intlgt 的 SMS 消息。可能的解决方案:

    1234563这将为您提供 srcgt 以 intlgt 中的值开头的记录。然后对 destgt 重复此操作。 1234563每个“长度”都需要)。

    如果两个关系中的行数不是太大,则在它们之间进行交叉,这将创建来自记录的行和来自 intlgt 的行的所有可能组合。然后就可以通过 STARTSWITH(srcgt, intlgt::intlgt) 进行过滤,因为它们两个是同一个关系的字段。请注意这种方法,因为记录的数量可能会变得非常庞大!

【讨论】:

嗨跑,你能看看我的帖子***.com/questions/37119870/…

以上是关于PIG:标量在输出中有不止一行的主要内容,如果未能解决你的问题,请参考以下文章

PIG - Scalar 在输出中有不止一行。 1s

为啥我的标量 UDF 函数返回不止一行?

Pig ERROR 0:Scalar在输出中有多行

将 Pig 输出转换为 JSON 格式

添加文件夹名称以输出 Pig Latin

Pig:更改输出文件 NAME 的格式