我是PigLatin的佼佼者,我需要一些(基本的,我认为)帮助。
我的数据描述为:
xmlToTuple: {(node_attr_id: int,tag: {(tag_attr_k: chararray,tag_attr_v: chararray)})}
和DUMP像这样:
((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)}))
任何人都可以解释我这样做吗?我有点失落......
答案 0 :(得分:3)
你应该使用地图而不是一袋元组。密钥将是您的tag_attr_k
,而您的值是tag_attr_v
。所以你的数据的一行是,例如,
(1751057677,['amenity'#'fast_food', 'name',#'Brochetterie'])
然后,您可以通过尝试访问密钥并检查该值是否为NULL
来检查密钥是否存在。
FILTER xml BY tag_attr#'amenity' IS NOT NULL;
答案 1 :(得分: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;
答案 2 :(得分:1)
您应该为此使用map
,而不是元组列表。地图就是为此目的而构建的。 http://pig.apache.org/docs/r0.10.0/basic.html#data-types
要过滤掉,你会这样做:
B = FILTER A BY mymap#'amenity' IS NOT NULL;