14

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

DUMP geoinfo;
([longitude#70.95853、latitude#30.9773])
([longitude#-9.37944507、latitude#38.91780853])
(null)
(null)
(null)
([longitude#-92.64416、latitude#16.73326])
(null)
(null)
([longitude#-9.15199849、latitude#38.71179122])
([longitude#-9.15210796、latitude#38.71195131])

ここに説明があります

DESCRIBE geoinfo;
geoinfo:{geoLocation:bytearray}

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

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

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

私もこういうことをやってみました

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

エラーが発生しました

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

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

詳細、ubuntuで実行、hadoop-1.0.3、豚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)OpenJDK 64ビットサーバーVM(ビルド20.0-b12、混合モード)

4

4 に答える 4

4

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

結局、問題は私が使用していた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';

乾杯

于 2012-11-17T04:54:32.413 に答える
3

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

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

ジオロケーションを経度と緯度をキーとするマップにする場合は、データをマップとしてロードし、次のようにnullをチェックできます。

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);

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

于 2012-11-07T12:22:16.380 に答える