2012-10-31 13 views
12

これは愚かな問題のようですが、私の行からnull値をフィルタリングする方法を見つけることができません。 私は、オブジェクトgeoinfoをダンプする際にこれが結果です:ここ豚でnull値をフィルタリングする

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 geoinfo BY geoLocation is not null;

でも結果は変わりません。何もフィルタされません。

また、私はこの

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

のようなものを試してみましたが、私は私が間違って何をやっているエラー

org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Cannot convert a map to a String

を得ましたか。

詳細、豚とUbuntuの、Hadoopの-1.0.3に2012年10月24日、19時04分03秒コンパイル(rexported)0.9.3

豚-version Apacheの豚バージョン0.9.3-SNAPSHOT を実行しています

Javaバージョン "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 != ''; 
+0

エラーが発生しました >エラーorg.apache.pig.tools.grunt.Grunt - エラー2997:バックエラーから例外を再作成できません:org.apache.pig.backend.executionengine.ExecException:エラー1071:マップを変換できません文字列に –

+0

かなり同じKishan。これを解決する方法を知らない。 –

+0

geoinfoとして与えてみてください。$ 0!= ''またはgeoinfo.geoLocation!= ''。 どちらかが動作するはずです – emkay

0

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

それが唯一の回避策のようなものですしかし、。

0

これを試してみてください:

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

を、私はそれがマップとしてタイプを認識しているエラーから見ることができるように。マップの特定のキーを指定する必要があります。 これでうまくいかない場合は、通常、そのデータをマップとして正しく取得していません。 Fredが示すとおりに試してください。

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

歓声