web-dev-qa-db-fra.com

Chargement de la ruche dans une table partitionnée

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.

15
Valery Yesypenko

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:

  1. Charger les données copie simplement les données, il ne les lit pas, il ne peut donc pas savoir quoi partitionner
  2. Suggère que vous chargiez d'abord les données dans une table intermédiaire (ou en utilisant une table externe pointant vers tous les fichiers), puis en laissant l'insertion dynamique de partition se lancer pour la charger dans une table partitionnée
16
Denny Lee
  1. 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).

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

3
appleboy

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.

3
Mauricio Morales

Que diriez-vous

LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');

0
user2720864