web-dev-qa-db-ja.com

pigでnull値をフィルタリングする

ばかげた問題のように見えますが、行からnull値をフィルタリングする方法が見つかりません。これは、オブジェクトgeoinfoをダンプしたときの結果です。

DUMP geoinfo;
([longitude#70.95853、latitude#30.9773])
([経度#-9.37944507、緯度#38.91780853])
(ヌル)
(ヌル)
(ヌル)
([経度#-92.64416、緯度#16.73326])
(ヌル)
(ヌル)
([経度#-9.15199849、緯度#38.71179122])
([経度#-9.15210796、緯度#38.71195131])

ここに説明があります

DESCRIBE geoinfo;
geoinfo:{geoLocation:bytearray}

私がやろうとしているのは、次のようにnull値をフィルタリングすることです。

geoinfo_no_nulls = FILTER geoinfo BYgeoLocationはnullではありません。

しかし、結果は同じままです。何もフィルタリングされません。

私もこのようなことを試みました

geoinfo_no_nulls = FILTER geoinfo BY geoLocation!= 'null';

エラーが発生しました

org.Apache.pig.backend.executionengine.ExecException:エラー1071:マップを文字列に変換できません

私は何が間違っているのですか?

詳細、ubuntuで実行、hadoop-1.0.3、pig 0.9.3

pigバージョンApachePigバージョン0.9.3-SNAPSHOT(再エクスポート)コンパイル済み2012年10月24日19:04:03

Javaバージョン "1.6.0_24" OpenJDKランタイム環境(IcedTea6 1.11.4)(6b24-1.11.4-1ubuntu0.12.04.1)OpenJDK64ビットサーバーVM(ビルド20.0-b12、ミックスモード)

12
Arian Pasquali

回答ありがとうございます。それは私が道を見つけるのを助けます。

結局、問題は私が使用していたJsonLoaderにあると思われます。正確な理由はわかりませんが、null文字列のバグがあると思われます。

私はついにコードを変更して 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';

乾杯

3
Arian Pasquali

私は同様の問題を抱えていました、そしてこのような何かが私のために働きました:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
3
emkay

これを試して:

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

エラーからわかるように、タイプをマップとして認識しています。マップの特定のキーを指定する必要があります。それが機能しない場合は、通常、そのデータをマップとして適切に取得していません。フレッドが示すように試してみてください。

0
ysr

地理位置情報を経度と緯度をキーとするマップにする場合は、データをマップとしてロードし、次のようにnullをチェックできます。

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

ただし、これは一種の回避策にすぎません。

0
Frederic