web-dev-qa-db-fra.com

Partitionnement dynamique de la ruche

J'essaie de créer une table partitionnée à l'aide du partitionnement dynamique, mais je suis confronté à un problème. J'utilise Hive 0.12 sur Hortonworks Sandbox 2.0.

set Hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;

mais cela ne fonctionne pas .. Je reçois une erreur.

Voici la requête pour créer la table demo_stg:

create table demo_stg
(
    country STRING,
    stadt STRING,
    geograph_breite FLOAT,
    id INT
    )
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\073";

Et demo_tab:

CREATE TABLE demo_tab 
(
    stadt STRING,
    geograph_breite FLOAT,
    id INT
)
PARTITIONED BY (land STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\073";
  • Le tableau demo_stg est également rempli de données, il n'est donc pas vide.

Merci pour l'aide :)

10
Baeumla

Vous devez modifier votre sélection:

set Hive.exec.dynamic.partition=true;
INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country
FROM demo_stg t;

Je ne sais pas à quelle colonne de la démonstration vous souhaitez effectuer le partitionnement ou à quelle colonne de la démonstration correspond le terrain. Mais quelle que soit la colonne, elle doit être présente en tant que dernière colonne de select, dites que le nom de la colonne de votre table de démonstration est id, donc votre sélection doit être écrite comme suit:

INSERT OVERWRITE TABLE demo_tab PARTITION (land)
SELECT stadt, geograph_breite, id, t.country,t.id as land
FROM demo_stg t;

Je pense que cela devrait fonctionner.

15
Tanveer

La colonne de partition doit être la dernière colonne de la requête de sélection.

Et autre chose que de définir la partition sur true, vous devez définir le mode sur nonstrict:

set Hive.exec.dynamic.partition.mode=nonstrict
8
Azam Khan