XPath - 标量在输出中有不止一行

Posted

技术标签:

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

我正在尝试使用来自 XML 的信息创建别名。我的代码有这个结构。

REGISTER /usr/lib/pig/piggybank.jar
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();

A = LOAD 'foo.xml' using org.apache.pig.piggybank.storage.XMLLoader('Document') as (x:chararray);

B = FOREACH A GENERATE XPath(x, 'Document/foo/bar/tag') as myTag:chararray;

C = LOAD 'foo.xml' using org.apache.pig.piggybank.storage.XMLLoader('someOtherTag') as (x:chararray);

D = FOREACH C GENERATE
    B.myTag,
    XPath(x, 'someOtherTag/taggy') as FOO:chararray;

dump D;

当我尝试显示 D 或存储它时,我总是得到一个 ERROR 0: Scalar 在输出中有不止一行。 (常见原因:“JOIN”然后“FOREACH ... GENERATE foo.bar”应该是“foo::bar”)

这个错误意义不大。如何解决?

编辑

好的,我发现 B 有不止一行。这很难,因为 illustratedump 只显示 1 行,但后来我使用了

B_GROUP = GROUP B BY myTag;
B_COUNT = FOREACH B1_GROUP GENERATE COUNT(B);
illustrate B_COUNT

它现在显示 B 的 2 行。如何删除额外的一行?

【问题讨论】:

你可以尝试分组,然后选择MAX。 B_GROUP = FOREACH (group all B) 生成 MAX(B.myTag) 作为 myTag 然后使用 B_GROUP.myTag 我用过 B = DISTINCT B;问题似乎已解决。 【参考方案1】:

当您想在 foreach 的 GENERATE 部分使用 B.mytag 时(假设 FOREACH 不在 B 上),您必须首先确保 B 只有一行。否则不清楚您要引用哪个 B.mytag。

【讨论】:

当我转储 B 时,我总是只得到一个 (value) 形式的值。

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

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

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

Flink Table API & SQL 自定义 Scalar 标量函数

如何在 Keras 中使用标量常数来衡量隐藏的标量输出

keras loss 必须每批输出一个标量还是整批输出一个标量?

Keras使用标量乘以层输出