2011-02-16 15 views
19

Tengo un montón de archivos de registro gzip en s3 que tienen 3 tipos de líneas de registro: b, c, i. i y C son tanto de un solo json nivel:¿Cómo puedo analizar JSON en Pig?

{"this":"that","test":"4"} 

Tipo b es profundamente json anidada. Me encontré con este gist hablando de compilar un jar para que esto funcione. Dado que mis habilidades en Java son menos que estelares, realmente no sabía qué hacer desde aquí.

{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}} 

Dado que los tipos I y C no son siempre en el mismo orden, esto hace especificando todo en la generación de expresiones regulares difícil. ¿Es posible manejar JSON (en un archivo gzip'd) con Pig? Estoy utilizando la versión de Pig incluida en una instancia de Amazon Elastic Map Reduce.

Esto se reduce a dos preguntas: 1) ¿Puedo analizar JSON con Cerdo (y si es así, cómo)? 2) Si puedo analizar JSON (desde un archivo de registro gzip'd), ¿puedo analizar los objetos JSON anidados?

Respuesta

5

Pig viene con un cargador JSON. Para cargar que utilice:

A = CARGA ‘data.json’
USO PigJsonLoader();

Para almacenar puede utilizar:

STORE INTO ‘output.json’ 
    USING PigJsonLoader(); 

Sin embargo, no estoy seguro de que es compatible con los datos GZIPed ....

+3

dónde/qué versión? 0.8.0 parece no saberlo por defecto. – ayman

+1

¿Parece que PigJsonLoader es un paquete separado? https: // github.com/mmay/PigJsonLoader –

16

cerdo 0,10 viene con orden interna JsonStorage y JsonLoader().

pig doc for json load/store

+0

Esta pregunta plantea una buena preocupación: http://stackoverflow.com/questions/15396550/loading-json-with-varying-schema-into-pig – gatoatigrado

+0

Esta debería ser la respuesta aceptada. –

2

Podemos hacerlo mediante el uso de JsonLoader ... Pero tenemos que mencionar el esquema para los datos JSON o de lo contrario puede producirse un error..just siga el siguiente enlace

  http://joshualande.com/read-write-json-apache-pig/ 

También lo podemos hacer creando UDF para analizarlo ...

0

Puede intentar usar el twitter elephantbird json loader, maneja los datos json dinámicamente. Pero tiene que ser muy preciso con el esquema.

api_data = LOAD 'file name' UTILIZANDO com.twitter.elephantbird.pig.load.JsonLoader ('- nestedLoad');

0

He visto aumentar mucho el uso de twitter elephantbird y se está convirtiendo rápidamente en la biblioteca goto para el análisis json en PIG.

Ejemplo:

DEFINE TwitterJsonLoader com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true '); 

JsonInput = LOAD 'input_path' USING TwitterJsonLoader() AS (entity: map[]); 

InputObjects = FOREACH JsonInput GENERATE (map[]) entity#'Object' AS JsonObject; 

InputIds = FOREACH InputObjects GENERATE JsonObject#'id' AS id; 
Cuestiones relacionadas