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!
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'
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.
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.
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
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/
.