2011-12-14 8 views
8
Pig: 0.8.1-cdh3u2 
Hadoop: 0.20.2-cdh3u0 

Errore di debug degli avvisi FIELD_DISCARDED_TYPE_CONVERSION_FAILED, ma non riesco a stampare singoli avvisi ovunque. La disabilitazione dell'aggregazione tramite lo switch -w o aggregate.warnings=false rimuove i messaggi di riepilogo, ma rimuove anche l'avviso effettivo, quindi non riesco a vedere quale tipo di conversione non è riuscita.Posizione di output di avvisi non aggregati suine?

Non c'è niente scritto nel registro del maiale per questa corsa, E non c'è posto per localizzare i registri con i singoli avvertimenti. Ho perso qualcosa di ovvio o semplicemente non funziona?

+0

Non vedo l'ora di rispondere a questa domanda. Di solito trovo il record manualmente. –

+0

Ho già chiuso a 100 milioni di record e aggiungendo 1/2 milione ogni giorno con oltre 300 colonne in ogni riga. E questi sono numeri decimali. Senza il supporto degli attrezzi è peggio che cercare un ago in un campo di covoni di fieno. – andrew

+0

L'unica cosa che posso pensare è di caricare i dati come un 'chararray' nel maiale, quindi scrivere un UDF che provi a convertirlo. Se viene lanciata un'eccezione, restituire l'oggetto (non restituire nulla in caso contrario). –

risposta

0

I registri del lavoro Hadoop sono registrati localmente su ciascun nodo di calcolo. Pertanto, per prima cosa è necessario configurare il gestore cluster hadoop per raccogliere i file di log sul sistema di file distribuiti in modo da poterli analizzare. Se si utilizza Hadoop-on-demand (http://hadoop.apache.org/docs/r0.17.0/hod.html) si dovrebbe essere in grado di farlo specificando qualcosa come:

log-destination-uri = hdfs://host123:45678/user/hod/logs 

consultare la documentazione HOD a http://hadoop.apache.org/docs/r0.17.0/hod_user_guide.html#Collecting+and+Viewing+Hadoop+Logs

Dopo aver ottenuto i log su HDFS è possibile eseguire una semplice query PIG per trovare la conversione incriminata. Qualcosa come il seguente dovrebbe fare il trucco:

a1= LOAD '*.log' USING PigStorage(']') ; 
a2= FILTER a1 by ($1 MATCHES ' WARN.*Unable to interpret value.*'); 
dump a2; 
0

E 'difficile trovare quali dati o il valore sta causando problema, ma almeno si può trovare quale colonna è la creazione di questo problema. Una volta trovata la colonna, puoi utilizzare Dynamic Invoker che potrebbe aiutarti nella conversione del tipo.

Come usare dinamico Invoker:
DEFINIRE ConvertToDouble InvokeForDouble ('java.lang.Double.parseDouble', 'String');

ConvertToDouble (column_name);