3

我是 PigLatin 的初学者,我需要一些(我认为是基本的)帮助。

我的数据描述为:

xmlToTuple: {(node_attr_id: int,tag: {(tag_attr_k: chararray,tag_attr_v: chararray)})}

像这样转储:

((704398904,{(lat,-13.00583333),(lon,45.24166667)}))
((1230941976,{(place,village)}))
((1230941977,{(name,Mtsahara)}))
((1751057677,{(amenity,fast_food),(name,Brochetterie)}))
((100948360,{(amenity,ferry_terminal)}))
((362795028,{(amenity,fuel),(operator,Total)}))

我想提取对 tag_attr_k 字段具有特定值的记录。例如,给我一个 tag_attr_k = amesity 的记录?那应该是:

((1751057677,{(amenity,fast_food),(name,Brochetterie)}))
((100948360,{(amenity,ferry_terminal)}))
((362795028,{(amenity,fuel),(operator,Total)}))

任何人都可以解释我这样做吗?我有点迷茫……</p>

4

3 回答 3

3

您应该使用地图而不是一袋元组。键将是您tag_attr_k的 s,您的值将是您的tag_attr_vs。因此,您的一行数据将是,例如,

(1751057677,['amenity'#'fast_food', 'name',#'Brochetterie'])

然后,您可以通过尝试访问它并检查值是否为 来检查密钥是否存在NULL

FILTER xml BY tag_attr#'amenity' IS NOT NULL;

于 2013-01-22T18:17:39.180 回答
2

我发现!

 XmlTag = FOREACH xmlToTuple GENERATE FLATTEN ($0);
    XmlTag2 = FOREACH XmlTag {
        tag_with_amenity = FILTER tag BY (tag_attr_k == 'amenity');
        GENERATE *, COUNT(tag_with_amenity) AS count;
    };
    XmlTag3 = FOREACH (FILTER XmlTag2 BY count > 0) GENERATE node_attr_id, node_attr_lon, node_attr_lat, tag;
于 2013-02-12T15:11:16.500 回答
1

您应该map为此使用 a,而不是元组列表。地图正是为此目的而构建的。http://pig.apache.org/docs/r0.10.0/basic.html#data-types

要过滤掉,您将执行以下操作:

B = FILTER A BY mymap#'amenity' IS NOT NULL;
于 2013-01-22T18:06:40.027 回答