J'ai un fichier journal en HDFS, les valeurs sont délimitées par des virgules. Par exemple:
2012-10-11 12:00,opened_browser,userid111,deviceid222
Maintenant, je veux charger ce fichier dans la table Hive qui a des colonnes "timestamp", "action" et partitionnées par "userid", "deviceid". Comment puis-je demander à Hive de prendre les 2 dernières colonnes du fichier journal comme partition pour la table? Tous les exemples e.g. "Hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');"
nécessitent la définition de partitions dans le script, mais je souhaite que les partitions soient configurées automatiquement à partir du fichier HDFS.
La seule solution consiste à créer une table intermédiaire non partitionnée avec toutes ces 4 colonnes, à la remplir à partir d'un fichier, puis à créer une INSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid;
mais c'est une tâche supplémentaire et nous aurons 2 tables très similaires. Ou nous devrait créer une table externe comme intermédiaire.
Ning Zhang a une excellente réponse sur le sujet à http://grokbase.com/t/Hive/user/114frbfg0y/can-i-use-Hive-dynamic-partition- while-loading-data-into- tables .
Le contexte rapide est que:
Comme mentionné dans la réponse de @Denny Lee, nous devons impliquer une table intermédiaire (invite_stg) gérée ou externe, puis INSÉRER de la table intermédiaire à la table partitionnée (les invitations dans ce cas).
Assurez-vous que ces deux propriétés sont définies sur:
SET Hive.exec.dynamic.partition=true;
SET Hive.exec.dynamic.partition.mode=nonstrict;
Et enfin insérer aux invitations,
INSERT OVERWRITE TABLE India PARTITION (STATE) SELECT COL's FROM invites_stg;
Reportez-vous à ce lien pour obtenir de l'aide: http://www.edupristine.com/blog/Hive-partitions-example
J'ai travaillé ce même scénario, mais à la place, nous avons créé des fichiers de données HDFS distincts pour chaque partition que vous devez charger.
Comme nos données proviennent d'un travail MapReduce, nous avons utilisé MultipleOutputs dans notre classe Reducer pour multiplexer les données dans leur fichier de partition correspondant. Ensuite, il s'agit simplement de construire le script en utilisant la partition à partir du nom du fichier HDFS.
Que diriez-vous
LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');