web-dev-qa-db-fra.com

Comment ajouter une partition en utilisant Hive à une date précise?

J'utilise Hive (avec des tables externes) pour traiter les données stockées sur Amazon S3.

Mes données sont partitionnées comme suit: 

                       DIR   s3://test.com/2014-03-01/
                       DIR   s3://test.com/2014-03-02/
                       DIR   s3://test.com/2014-03-03/
                       DIR   s3://test.com/2014-03-04/
                       DIR   s3://test.com/2014-03-05/

s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log

Comment créer une table de partition en utilisant ruche?

   CREATE EXTERNAL TABLE test (
    foo string,
    time string,
    bar string
    )  PARTITIONED BY (? string)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    LOCATION 's3://test.com/';

Quelqu'un pourrait-il répondre à cette question? Merci!

11
brisk

Commencez d'abord par la bonne définition de table. Dans votre cas, je vais simplement utiliser ce que vous avez écrit:

CREATE EXTERNAL TABLE test (
    foo string,
    time string,
    bar string
)  PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';

Hive par défaut s'attend à ce que les partitions se trouvent dans des sous-répertoires nommés via la convention s3: //test.com/partitionkey=partitionvalue. Par exemple

s3://test.com/dt=2014-03-05

Si vous suivez cette convention, vous pouvez utiliser MSCK pour ajouter toutes les partitions.

Si vous ne pouvez ou ne voulez pas utiliser cette convention de dénomination, vous devez ajouter toutes les partitions comme suit:

ALTER TABLE test
    ADD PARTITION (dt='2014-03-05')
    location 's3://test.com/2014-03-05'
32
Carter Shanklin

Si vous allez partitionner en utilisant le champ de date, vous avez besoin de la structure de dossiers s3 décrite ci-dessous.

s3: //test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log

Dans ce cas, vous pouvez créer une table externe avec la colonne de partition sous la forme date Et exécuter MSCK REPAIR TABLE EXTERNAL_TABLE_NAME pour mettre à jour le méta-magasin Hive.

2
Venkatesh

Veuillez regarder la réponse postée ci-dessus par Carter Shanklin. Vous devez vous assurer que vos fichiers sont stockés dans la structure de répertoires en tant que partitionkey = partitionvalue, c'est-à-dire que Hive s'attend par défaut à ce que les partitions se trouvent dans des sous-répertoires nommés via la convention.

Dans votre exemple, il devrait être stocké comme 

s3: //test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log.

Étapes à suivre:

i) Assurez-vous que les données existent dans la structure ci-dessus ii) Créez la table externe iii) Exécutez maintenant la table de réparation msck.

2
doniv

Je pense que les données sont présentes dans l'emplacement s3 et pourraient ne pas être mises à jour dans les métadonnées, (emrfs). Pour que cela fonctionne en premier, effectuez emrfs import et emrfs sync ..__, puis appliquez la réparation msck.

Il va ajouter toutes les partitions présentes dans s3

1
Achyuth

Si vous avez une structure de répertoire existante non conforme à <partition name>=<partition value>, vous devez ajouter des partitions manuellement. MSCK REPAIR TABLE ne fonctionnera que si vous structurez votre répertoire de la manière suivante.

Après avoir spécifié l'emplacement sur la création de la table, procédez comme suit:

 CREATE EXTERNAL TABLE test (
 Chaîne foo, 
 Chaîne temporelle, 
 Chaîne bar 
) 
 PARTITIONED BY (chaîne dt) 
 ROW FORMAT DELIMITED 
 ZONE TERMINÉE PAR '\ t' 
 LOCATION 's3: //test.com/'; 

Vous pouvez ajouter une partition sans spécifier le chemin complet:

ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05';

Bien que je ne l'aie jamais vérifiée, je vous suggère de déplacer vos partitions dans un dossier situé dans le compartiment, pas directement dans le compartiment même. Par exemple. de s3://test.com/ à s3://test.com/data/.

0
cakraww