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
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 ...
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
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;
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