2012-10-31 17 views
12

Wygląda na głupi problem, ale nie mogę znaleźć sposobu na filtrowanie pustych wartości z moich wierszy. Jest to wynik, kiedy zrzucić geoinfo obiektu:Filtrowanie pustych wartości za pomocą świni

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

Oto opis

DESCRIBE geoinfo;
geoinfo: {geoLocation: bytearray}

Co usiłuję zrobić jest filtrowanie wartości null tak:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation is not null;

, ale wynik pozostaje taki sam. nic nie jest filtrowane.

Próbowałem też coś takiego

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

i mam błąd

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

Co robię źle?

szczegóły, działa na Ubuntu, Hadoop-1.0.3 ze świni 0.9.3

świnia -version Apache Pig wersji 0.9.3-SNAPSHOT (rexported) skompilowany 24 października 2012, 19:04:03

wersja

java "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64-bitowy serwer VM (build 20.0-B12, tryb mieszany)

+0

Proszę wysłać kompletny skrypt. –

Odpowiedz

3

Miałem podobny problem i coś takiego działało dla mnie:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != ''; 
+0

Mam błąd > BŁĄD org.apache.pig.tools.grunt.Grunt - ERROR 2997: Nie można odtworzyć wyjątku z kopii zapasowej błędu: org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Nie można przekonwertować mapy na sznurek –

+0

W zasadzie taki sam Kishan. Nie wiem, jak rozwiązać ten problem. –

+0

Spróbuj podać go jako geoinfo. $ 0! = '' Lub geoinfo.geoLocation! = ''. Każda z nich powinna działać – emkay

0

Zakładając chcesz, aby Twój geolokalizacja być mapa z długości i szerokości geograficznej, jak klucze, można załadować dane w formie mapy i sprawdzić null następująco:

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

To rodzaj obejście tylko , chociaż.

0

Spróbuj tego:

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

Jak widzę z błędem to rozpoznaje typ mapy. Musisz określić konkretny klucz mapy. Jeśli to nie działa, zazwyczaj nie dostajesz tych danych poprawnie jako mapy. Proszę spróbować, jak wskazuje Fred.

3

Dziękuję za odpowiedzi. To mi pomoże znaleźć drogę.

Na koniec problemy z połączeniem z JsonLoader, którego używałem. Nie wiem, dlaczego dokładnie, ale szwy mają błąd z pustymi ciągami.

W końcu zmieniłem kod, aby użyć https://github.com/kevinweil/elephant-bird.

kod wygląda teraz tak:

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

okrzyki

Powiązane problemy