ばかげた問題のように見えますが、行から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、ミックスモード)
回答ありがとうございます。それは私が道を見つけるのを助けます。
結局、問題は私が使用していた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';
乾杯
私は同様の問題を抱えていました、そしてこのような何かが私のために働きました:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
これを試して:
geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);
エラーからわかるように、タイプをマップとして認識しています。マップの特定のキーを指定する必要があります。それが機能しない場合は、通常、そのデータをマップとして適切に取得していません。フレッドが示すように試してみてください。
地理位置情報を経度と緯度をキーとするマップにする場合は、データをマップとしてロードし、次のようにnullをチェックできます。
A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;
ただし、これは一種の回避策にすぎません。