这看起来像一个愚蠢的问题,但我找不到从我的行中过滤空值的方法。 这是我转储对象geoinfo时的结果:
DUMP geoinfo;
([经度#70.95853,纬度#30.9773])
([经度#-9.37944507,纬度#38.91780853])
(空)
(空)
(空)
([经度#-92.64416,纬度#16.73326])
(空)
(空)
([经度#-9.15199849,纬度#38.71179122])
([经度#-9.15210796,纬度#38.71195131])
这是描述
DESCRIBE geoinfo;
geoinfo:{geoLocation:bytearray}
我要做的是过滤这样的空值:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation不为空;
但结果仍然相同。什么都没有过滤。
我也试过这样的事情
geoinfo_no_nulls = FILTER geoinfo BY geoLocation!='null';
我收到了错误
org.apache.pig.backend.executionengine.ExecException:错误1071:无法将地图转换为字符串
我做错了什么?
详细信息,在ubuntu上运行,hadoop-1.0.3 with pig 0.9.3
猪转化 Apache Pig版本0.9.3-SNAPSHOT(rexported) 编译于2012年10月24日,19:04:03java版“1.6.0_24” OpenJDK运行时环境(IcedTea6 1.11.4)(6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64位服务器VM(内置20.0-b12,混合模式)
答案 0 :(得分:3)
我有类似的问题,这样的事情对我有用:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
答案 1 :(得分:3)
谢谢你的回答。 它帮助我找到了路径。
最后问题与我正在使用的JsonLoader有关。 我不知道究竟是为什么,但是它会产生一个带有空字符串的错误。
我终于将我的代码更改为使用https://github.com/kevinweil/elephant-bird。
代码现在看起来像这样:
register 'elephant-bird-core-3.0.0.jar'
register 'elephant-bird-pig-3.0.0.jar'
register 'google-collections-1.0.jar'
register 'json-simple-1.1.jar'
json_lines = LOAD '/twitterecho/tweets/stream/v1/json/2012_10_10/08' USING com.twitter.elephantbird.pig.load.JsonLoader();
geo_tweets = FOREACH json_lines GENERATE (CHARARRAY) $0#'id' AS id, (CHARARRAY) $0#'geoLocation' AS geoLocation;
tweets_grp = GROUP geo_tweets BY id;
unique_tweets = FOREACH tweets_grp {
first_tweet = LIMIT inpt 1;
GENERATE FLATTEN(first_tweet);
};
only_not_nulls = FILTER geo_tweets BY geoLocation is not null;
store only_not_nulls into '/twitter_data/results/geo_tweets';
欢呼声
答案 2 :(得分:0)
假设您希望地理位置是经度和纬度作为关键字的地图,您可以将数据作为地图加载并检查空值,如下所示:
A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;
但这只是一种解决方法。
答案 3 :(得分:0)
试试这个:
geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);
正如我从错误中看到的那样,它将类型识别为地图。您需要指定地图的特定键。 如果这不起作用,您通常无法将数据正确地作为地图获取。 请像弗雷德所说的那样试试。