0

我在引用 a 中的“父”字段时遇到问题foreach

grunt> describe METRICS_SOURCE_WITH_CNT
METRICS_SOURCE_WITH_CNT: 
{group: (hostname: chararray,site_guid: chararray,timestamp: long),
JOIN_FIELDS_ONLY: {(timestamp: long, unique_pageviews: long)},cnt: long

请注意,这cnt是元组的总数。

METRICS_SOURCE_TOP3 = foreach METRICS_SOURCE_WITH_CNT {

    SORTED = ORDER JOIN_FIELDS_ONLY by unique_pageviews DESC;
    TOPK = LIMIT SORTED 10;

    REVSORTED = ORDER JOIN_FIELDS_ONLY by unique_pageviews ASC;
    BOTTOMK = LIMIT REVSORTED cnt;

    generate TOPK, BOTTOMK;
}

但似乎当我应用第二个时LIMIT,Pig 认为该cnt字段在 within REVSORTED,但它实际上是一个“父”字段。

Invalid field projection. Projected field [cnt] does not exist in schema: timestamp:long,....

我试过按数字引用字段,$x但它不起作用。Pig 总是认为被引用的字段在被LIMIT'd的关系内

4

1 回答 1

1

您需要使用 Pig 的取消引用运算符,它允许您使用.. 对于您的示例:

METRICS_SOURCE_TOP3 = foreach METRICS_SOURCE_WITH_CNT {

    SORTED = ORDER JOIN_FIELDS_ONLY by unique_pageviews DESC;
    TOPK = LIMIT SORTED 10;

    REVSORTED = ORDER JOIN_FIELDS_ONLY by unique_pageviews ASC;
    BOTTOMK = LIMIT REVSORTED METRICS_SOURCE_WITH_CNT.cnt;

    generate TOPK, BOTTOMK;
}

另外有趣的是,在 0.10 之前,Pig 不支持语句中的标量LIMIT,所以这种语句会失败。

于 2013-01-22T13:57:13.063 回答