Je veux créer une table Hive à partir de certaines données JSON (imbriquées) et y exécuter des requêtes? Est-ce seulement possible?
Je suis arrivé à télécharger le fichier JSON sur S3 et à lancer une instance EMR, mais je ne sais pas quoi taper dans la console Hive pour que le fichier JSON soit une table Hive?
Quelqu'un at-il un exemple de commande pour me lancer, je ne trouve rien d'utile avec Google ...
Vous devrez utiliser une serde JSON pour que Hive mappe votre JSON aux colonnes de votre table.
Un très bon exemple vous montrant comment ça se passe:
http://aws.Amazon.com/articles/2855
Malheureusement, la serde JSON fournie ne gère pas très bien le JSON imbriqué, vous devrez donc peut-être aplatir votre JSON pour l'utiliser.
Voici un exemple de la syntaxe correcte de l'article:
create external table impressions (
requestBeginTime string, requestEndTime string, hostname string
)
partitioned by (
dt string
)
row format
serde 'com.Amazon.elasticmapreduce.JsonSerde'
with serdeproperties (
'paths'='requestBeginTime, requestEndTime, hostname'
)
location 's3://my.bucket/' ;
Il n'est en fait pas nécessaire d'utiliser le JSON SerDe. Il y a un excellent article de blog ici (je ne suis en aucun cas affilié à l'auteur):
http://pkghosh.wordpress.com/2012/05/06/Hive-plays-well-with-json/
Qui décrit une stratégie utilisant la fonction intégrée json_Tuple pour analyser le json au moment de la requête (PAS au moment de la définition de la table):
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_Tuple
Donc, fondamentalement, votre schéma de table consiste simplement à charger chaque ligne sous la forme d'une seule colonne "chaîne", puis à extraire les champs json pertinents selon les besoins, par requête. par exemple. cette requête de ce blog:
SELECT b.blogID, c.email FROM comments a LATERAL VIEW json_Tuple(a.value, 'blogID', 'contact') b
AS blogID, contact LATERAL VIEW json_Tuple(b.contact, 'email', 'website') c
AS email, website WHERE b.blogID='64FY4D0B28';
Dans mon humble expérience, cela s'est avéré plus fiable (j'ai rencontré divers problèmes cryptiques concernant les serdes JSON, en particulier avec les objets imbriqués).
Je devais juste résoudre le même problème, et aucun des éléments encore liés à JSON SerDes ne semblait assez bon. Amazon est peut-être bon, mais je ne peux trouver la source nulle part (est-ce que quelqu'un a un lien?).
Le HCatalog intégré à JsonSerDe fonctionne pour moi, même si je n'utilise pas HCatalog ailleurs.
Pour utiliser JsonSerDe de HCatalog, ajoutez le .jar hcatalog-core au chemin Auxive de Hive et créez votre table Hive:
$ Hive --auxpath /path/to/hcatalog-core.jar
Hive (default)>
create table my_table(...)
ROW FORMAT SERDE
'org.Apache.hcatalog.data.JsonSerDe'
...
;
J'ai écrit un article ici avec plus de détails
Hive 0.12 et versions ultérieures dans hcatalog-core ont JsonSerDe qui sérialisera et désérialisera vos données JSON. Donc, tout ce que vous devez faire est de créer une table externe comme dans l'exemple suivant:
CREATE EXTERNAL TABLE json_table (
username string,
Tweet string,
timestamp long)
ROW FORMAT SERDE
'org.Apache.Hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION
'hdfs://data/some-folder-in-hdfs'
Le fichier de données json correspondant devrait ressembler à l'exemple suivant:
{"username":"miguno","Tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","Tweet":"Works as intended. Terran is IMBA.","timestamp": 1366154481 }
Si votre fichier .json est volumineux, il peut être fastidieux d'écrire le schéma à la main. Si c'est le cas, vous pouvez utiliser cet outil pratique pour le générer automatiquement.
Les capacités de traitement JSON sont désormais disponibles dans Hive prêt à l'emploi.
Hive 4.0.0 et versions ultérieures
CREATE TABLE ... STORED AS JSONFILE
Chaque objet JSON doit être aplati pour tenir sur une seule ligne (ne prend pas en charge les caractères de nouvelle ligne). Ces objets ne font pas partie d'un tableau JSON formel.
{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}