Comment puis-je Parser JSON dans Pig?
j'ai beaucoup de gzip avais des fichiers journaux dans s3 qui a 3 types de lignes de log: b,c,j'. i et c sont les deux seul niveau json:
{"this":"that","test":"4"}
<!-Le Type b est profondément imbriqué dans le json. Je suis tombé sur ce gist on parle de compiler un bocal pour que ça marche. Comme mes compétences en java sont loin d'être exceptionnelles, Je ne savais pas vraiment quoi faire 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, Cela fait spécifier tout dans le Regex generate difficile. La manipulation de JSON (dans un fichier gzip) est-elle possible avec Pig? J'utilise n'importe quelle version de Pig construite sur une instance de réduction de carte élastique D'Amazon.
Cela se résume à deux questions: 1) Puis-je Parser JSON avec Pig (et si oui, comment)? 2) Si je peux analyser JSON (à partir d'un fichier log de gzip), puis-je analyser des objets JSON imbriqués?
7 réponses
Pig 0.10 est livré avec builtin JsonStorage et JsonLoader().
après beaucoup de solutions de rechange et de travail à travers les choses, j'ai été en mesure de répondre pour obtenir ce fait. J'ai fait un article à ce sujet sur mon blog sur la façon de faire cela. Il est disponible ici: http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
Le cochon est livré avec un chargeur JSON. Pour charger vous utilisez:
A = CHARGEMENT des données.json'
USING PigJsonLoader ();
Pour stocker vous pouvez utiliser:
STORE INTO ‘output.json’
USING PigJsonLoader();
cependant, je ne suis pas sûr qu'il supporte les données GZIPed....
nous pouvons le faire en utilisant JsonLoader...Mais nous devons mentionner le schéma pour vos données json sinon il peut se produire une erreur..il suffit de suivre le lien ci-dessous
http://joshualande.com/read-write-json-apache-pig/
on peut aussi le faire en créant UDF pour le parser...
Vous pouvez essayer usin le twitter elephantbird json chargeur , Il gère les données json dynamiquement.Mais vous devez être très précis avec le schéma .
api_data = LOAD 'file name' USING com.Twitter.eléphantbird.porc.charge.JsonLoader ('- nestedLoad');
j'ai vu l'utilisation de twitter elephantbird augmenter beaucoup et il est rapidement devenu le goto bibliothèque json l'analyse en COCHON.
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;