2012-10-31 17 views
12

Sembra un problema stupido, ma non riesco a trovare un modo per filtrare valori nulli dalle mie righe. Questo è il risultato quando ho discarica il GEOINFO oggetto:Filtro valori null con maiale

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

Ecco la descrizione

DESCRIBE geoinfo;
geoinfo: {geoLocation: bytearray}

Quello che sto cercando di fare è quello di filtrare i valori nulli in questo modo:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation is not null;

ma il risultato rimane lo stesso. nulla viene filtrato.

Ho anche provato qualcosa di simile

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

e ho ottenuto un errore

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

Che cosa sto facendo di sbagliato?

dettagli, in esecuzione su Ubuntu, Hadoop-1.0.3 con il maiale 0.9.3

maiale -version Apache Pig versione 0.9.3-SNAPSHOT (rexported) compilato 24 ottobre 2012, 19:04:03

versione

java "1.6.0_24" OpenJDK Runtime Environment (icedtea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK a 64 bit di server VM (build 20.0-b12, modalità mista)

+0

Si prega di inviare il vostro script completo. –

risposta

3

Stavo riscontrando un problema simile e qualcosa del genere ha funzionato per me:

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

Ho ricevuto l'errore > ERRORE org.apache.pig.tools.grunt.Grunt - ERRORE 2997: impossibile ricreare un'eccezione dall'errore di backup: org.apache.pig.backend.executionengine.ExecException: ERRORE 1071: impossibile convertire una mappa a una stringa –

+0

Più o meno lo stesso Kishan. Non so come risolvere questo. –

+0

Prova a darlo come geoinfo. $ 0! = '' O geoinfo.geoLocation! = ''. Ognuno di loro dovrebbe funzionare – emkay

0

si Supponendo che volete che il vostro geolocalizzazione per essere una mappa con longitudine e latitudine di chiavi, è possibile caricare i dati come mappa e verificare la presenza di valori nulli come segue:

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

è una specie di una soluzione unica , anche se.

0

Prova questo:

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

Come posso vedere dall'errore si sta riconoscendo il tipo come una mappa. Devi specificare la chiave particolare della mappa. Se ciò non funziona, normalmente non si ottengono quei dati correttamente come una mappa. Si prega di provare come Fred indica.

3

Grazie per le vostre risposte ragazzi. Mi aiuta a trovare il percorso.

Alla fine il problema si presenta con il JsonLoader che stavo usando. Non so perché esattamente, ma sembra avere un bug con stringhe null.

Ho finalmente modificato il mio codice per utilizzare https://github.com/kevinweil/elephant-bird.

il codice appare come segue:

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

applausi