14

这看起来像一个愚蠢的问题,但我找不到从我的行中过滤空值的方法。这是我转储对象地理信息时的结果:

转储地理信息;
([longitude#70.95853,latitude#30.9773])
([longitude#-9.37944507,latitude#38.91780853])
(null)
(null)
(null)
([longitude#-92.64416,latitude#16.73326])
(null)
(null)
([经度#-9.15199849,纬度#38.71179122])
([经度#-9.15210796,纬度#38.71195131])

这是描述

描述地理信息;
地理信息:{geoLocation:字节数组}

我想要做的是过滤这样的空值:

geoinfo_no_nulls = 按地理位置过滤地理信息不为空;

但结果保持不变。什么都没有过滤。

我也尝试过这样的事情

geoinfo_no_nulls = 按地理位置过滤地理信息!= 'null';

我得到了一个错误

org.apache.pig.backend.executionengine.ExecException:错误 1071:无法将映射转换为字符串

我究竟做错了什么?

细节,在 ubuntu 上运行,hadoop-1.0.3 和 pig 0.9.3

pig -version Apache Pig 版本 0.9.3-SNAPSHOT (rexported) 编译于 2012 年 10 月 24 日,19:04:03

java version "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

4

4 回答 4

4

谢谢你们的回答。它帮助我找到路径。

最后,问题与我使用的 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';

干杯

于 2012-11-17T04:54:32.413 回答
3

我遇到了类似的问题,这样的事情对我有用:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
于 2012-10-31T18:40:21.813 回答
0

假设您希望您的地理位置是以经度和纬度为键的地图,您可以将数据加载为地图并检查空值,如下所示:

A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;

不过,这只是一种解决方法。

于 2012-10-31T22:55:39.653 回答
0

尝试这个:

geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);

正如我从错误中看到的那样,它将类型识别为地图。您需要指定地图的特定键。如果这不起作用,您通常无法正确获取该数据作为地图。请按照 Fred 的指示尝试。

于 2012-11-07T12:22:16.380 回答