web-dev-qa-db-fra.com

Hive: analyse JSON

J'essaie d'obtenir des valeurs de JSON imbriqué pour des millions de lignes (5 To + table). Quelle est la manière la plus efficace de procéder?

Voici un exemple:

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}

J'ai besoin de ces valeurs hors du JSON ci-dessus:

Country        Page      impressions_s       impressions_o
---------      -----     -------------       --------------
US              2        10                  10

Ceci est la fonction json_Tuple de Hive, je ne sais pas si c'est la meilleure fonction. https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject

16
Don P

Vous pouvez utiliser get_json_object:

 select get_json_object(fieldname, '$.country'), 
        get_json_object(fieldname, '$.data.ad.s') from ... 

Vous obtiendrez de meilleures performances avec json_Tuple mais j'ai trouvé un "comment faire" pour obtenir les valeurs de json dans json; Pour formater votre table, vous pouvez utiliser quelque chose comme ceci:

from table t lateral view explode( split(regexp_replace(get_json_object(ln, ''$.data.ad.s'), '\\[|\\]', ''), ',' ) ) tb1 as s ce code ci-dessus vous transformera "Array" en colonne.

forme plus: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF

J'espère que cette aide ...

14
Wemerson Cesar

Voici ce que vous pouvez essayer rapidement, je suggère d'utiliser Json-Ser-De .

nano /tmp/Hive-parsing-json.json

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}

Créer une table de base:

Hive > CREATE TABLE Hive_parsing_json_table ( json string );

Chargez le fichier json dans la table:

Hive > LOAD DATA LOCAL INPATH  '/tmp/Hive-parsing-json.json' INTO TABLE Hive_parsing_json_table;

Recherchez la table:

Hive >  select v1.Country, v1.Page, v4.impressions_s, v4.impressions_o 
from Hive_parsing_json_table hpjp
     LATERAL VIEW json_Tuple(hpjp.json, 'country', 'page', 'data') v1
     as Country, Page, data
     LATERAL VIEW json_Tuple(v1.data, 'ad') v2
     as Ad
     LATERAL VIEW json_Tuple(v2.Ad, 'impressions') v3
     as Impressions
     LATERAL VIEW json_Tuple(v3.Impressions, 's' , 'o') v4
     as impressions_s,impressions_o;  

Production :

v1.country  v1.page     v4.impressions_s    v4.impressions_o
US      227     10          10
8
Sanjiv

En utilisant Hive native json-serde('org.Apache.Hive.hcatalog.data.JsonSerDe') vous pouvez le faire .. voici les étapes

ADD JAR /path/to/Hive-hcatalog-core.jar;

create a table as below 
 CREATE TABLE json_serde_nestedjson (
  country string,
  page int,
  data struct < ad: struct < impressions: struct < s:int, o:int  > > >
)
ROW FORMAT SERDE 'org.Apache.Hive.hcatalog.data.JsonSerDe';

puis charger les données (stockées dans un fichier)

LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson;

puis obtenez les données requises en utilisant

SELECT country, page, data.ad.impressions.s, data.ad.impressions.o 
FROM json_serde_nestedjson;  
3
Hemantha Kumara M S

L'implémentation d'un SerDe pour analyser vos données en JSON est un meilleur moyen pour votre cas.

Un tutoriel sur la façon d'implémenter SerDe pour l'analyse JSON peut être trouvé ici

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-Apache-Hive/

Vous pouvez également utiliser l'exemple d'implémentation SerDe suivant

https://github.com/rcongiu/Hive-JSON-Serde

1
HuntingCheetah