web-dev-qa-db-fra.com

Partitionner les colonnes lors de l'insertion dans une table Hive à partir d'une sélection

Je cherchais des partitions dans Hive et suis tombé sur:

http://www.brentozar.com/archive/2013/03/introduction-to-Hive-partitioning/ Dans ce lien, l'auteur dit: "Lors de l'insertion de données dans une partition, il est nécessaire de inclure les colonnes de partition comme les dernières colonnes de la requête. Les noms de colonne dans la requête source n'ont pas besoin de correspondre aux noms de colonne de partition, mais ils doivent vraiment être les derniers - il n'y a aucun moyen de câbler Hive différemment "

J'ai une requête comme:

insert overwrite table MyDestTable PARTITION (partition_date)
select
grid.partition_date,
….

J'ai la requête ci-dessus qui fonctionne depuis un certain temps sans erreur. Comme vous pouvez le voir, je sélectionne la colonne de partition comme toute première colonne. Est-ce faux? J'ai essayé de corroborer la déclaration de l'auteur provenant d'autres sources, mais je ne trouve pas d'autres documents qui disent la même chose. Quelqu'un ici sait-il quelle est la bonne chose à faire? De mon côté, étant un novice de Hive, je me demande simplement si Hive se plaint ou non (ce qui n'est pas le cas).

KS

14
KS1234

exemple:

set Hive.exec.dynamic.partition=true;  
set Hive.exec.dynamic.partition.mode=nonstrict;  

drop table tmp.table1;

create table tmp.table1(  
col_a string,col_b int)  
partitioned by (ptdate string,ptchannel string)  
row format delimited  
fields terminated by '\t' ;  

insert overwrite table tmp.table1 partition(ptdate,ptchannel)  
select col_a,count(1) col_b,ptdate,ptchannel
from tmp.table2
group by ptdate,ptchannel,col_a ;
32
anyoneking

Les colonnes de partition dynamique doivent être spécifiées en dernier parmi les colonnes de l'instruction SELECT et dans le même ordre dans lequel elles apparaissent dans la clause PARTITION ().

voir Hive wiki pour plus d'informations.

9
pensz

Oui, il est obligatoire d'utiliser la colonne partitionnée comme dernière colonne lors de l'insertion des données. Assurez-vous que la colonne PARTITIONNÉE PAR ne doit pas être une colonne existante dans le tableau, la ruche s'occupe du reste.

CREATE EXTERNAL TABLE temp (
DATA_OWNER STRING,
DISTRICT_CODE STRING,
BILLING_ACCOUNT_NO STRING,
INST_COUNTY STRING,
INST_POST_CODE STRING,
INST_STATUS STRING,
INST_EXCHANGE_GROUP_CODE STRING,
EXCHANGE_CODE STRING
) PARTITIONED BY (TS_LAST_UPDATED STRING)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001'
STORED AS TEXTFILE LOCATION 'user/entity/site/inbound/CSS_INSTALLATION_PARTITIONED';

INSERT OVERWRITE TABLE temp PARTITION (TS_LAST_UPDATED)
SELECT
DATA_OWNER,
DISTRICT_CODE,
BILLING_ACCOUNT_NO,
INST_COUNTY,
INST_POST_CODE,
INST_STATUS,
INST_EXCHANGE_GROUP_CODE,
EXCHANGE_CODE,TO_DATE(TS_LAST_UPDATED) FROM temp1 
7
Satheesh