Pytanie Filtrowanie wartości pustych przy pomocy świni


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

DUMP geoinfo;   
([długość geograficzna 70,95853, szerokość geograficzna 30,9773])   
([długość geograficzna # -9.37944507, szerokość geograficzna # 38.91780853])   
(zero)   
(zero)   
(zero)   
([długość geograficzna # -92,64416, szerokość geograficzna 16.73326])   
(zero)   
(zero)   
([długość geograficzna # -9.15199849, szerokość geograficzna # 38.71179122])   
([długość geograficzna # -9.15210796, szerokość geograficzna # 38.71195131])

tutaj jest opis

DESCRIBE geoinfo;   
geoinfo: {geoLocation: bytearray}

Co próbuję zrobić, to filtrować wartości null w ten sposób:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation nie jest null;

ale wynik pozostaje ten sam. nic nie jest filtrowane.

Próbowałem też czegoś takiego

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

i mam błąd

org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Nie można przekonwertować mapy na ciąg

Co ja robię źle?

szczegóły, działa na ubuntu, hadoop-1.0.3 ze świnią 0.9.3

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

wersja Java "1.6.0_24" Środowisko uruchomieniowe OpenJDK (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) 64-bitowa maszyna wirtualna OpenJDK (kompilacja 20.0-b12, tryb mieszany)


12
2017-10-31 18:26


pochodzenie


Proszę napisać swój kompletny skrypt. - reo katoa


Odpowiedzi:


Dziękuję za odpowiedzi. Pomaga mi znaleźć drogę.

W końcu problem łączy się 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 do użycia 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';

Twoje zdrowie


3
2017-10-31 18:40





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

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';

3
2017-10-31 22:55



Wystąpił błąd> ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Nie można odtworzyć wyjątku z chronionego błędu: org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Nie można przekonwertować mapy na Strunowy - Arian Pasquali
W zasadzie taki sam Kishan. Nie wiem, jak rozwiązać ten problem. - Arian Pasquali
Spróbuj podać go jako geoinfo. $ 0! = '' Lub geoinfo.geoLocation! = ''. Każda z nich powinna działać - emkay


Zakładając, że geolokalizacja ma być mapą o długości i szerokości geograficznej jako kluczami, można załadować dane jako mapę i sprawdzić wartości zerowe w następujący sposób:

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

Jest to jednak tylko obejście.


0
2017-11-07 12:22





Spróbuj tego:

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

Jak wynika z błędu, rozpoznaje typ jako mapę. Musisz określić konkretny klucz mapy. Jeśli to nie działa, zwykle nie dostajesz tych danych poprawnie jako mapy. Spróbuj, jak wskazuje Fred.


0