2011-02-16 6 views
19

J'ai beaucoup de fichiers journaux gzip dans d3 qui ont 3 types de lignes de journal: b, c, i. i et c sont tous les deux json à un seul niveau:Comment analyser JSON dans Pig?

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

Le type b est json profondément imbriqué. Je suis tombé sur ce gist en parlant de compiler un pot pour faire ce travail. Depuis que mes compétences en java sont moins que stellaires, je ne savais pas vraiment quoi faire à partir d'ici.

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

Puisque les types i et c ne sont pas toujours dans le même ordre, ce qui rend tout en spécifiant dans le générer regex difficile. La gestion de JSON (dans un fichier gzip'd) est-elle possible avec Pig? J'utilise n'importe quelle version de Pig est construite sur une instance de Amazon Elastic Map Reduce.

Cela se résume à deux questions: 1) Puis-je analyser JSON avec Pig (et si oui, comment)? 2) Si je peux analyser JSON (à partir d'un fichier journal gzip), puis-je analyser des objets JSON imbriqués?

Répondre

5

Le cochon est livré avec un chargeur JSON. Pour utiliser la charge:

A = CHARGE « data.json »
UTILISATION PigJsonLoader();

Pour enregistrer, vous pouvez utiliser:

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

Cependant, je ne suis pas sûr qu'il prend en charge les données GZIPed ....

+3

où/quelle version? 0.8.0 ne semble pas le savoir par défaut. – ayman

+1

PigJsonLoader semble être un paquet séparé? https: // github.com/mmay/PigJsonLoader –

16

Pig 0,10 est livré avec JsonStorage builtin et JsonLoader().

pig doc for json load/store

+0

Cette question soulève un problème: http://stackoverflow.com/questions/15396550/loading-json-with-varying-schema-into-pig – gatoatigrado

+0

Ceci devrait être la réponse acceptée. –

2

Nous pouvons le faire en utilisant JsonLoader ... Mais il faut mentionner le schéma pour vos données JSON ou bien il peut se produire un error..just suivre le lien ci-dessous

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

Nous pouvons également le faire en créant UDF pour l'analyser ...

0

Vous pouvez essayer usin le twitter joe loader elephantbird, Il gère les données json dynamiquement.Mais vous devez être très précis avec le schéma.

api_data = CHARGER 'nom de fichier' en utilisant com.twitter.elephantbird.pig.load.JsonLoader ('-nestedLoad');

0

J'ai vu l'utilisation de twitter elephantbird augmenter beaucoup et elle devient rapidement la bibliothèque de goto pour l'analyse json en PIG.

Exemple:

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;