web-dev-qa-db-fra.com

Hive Comment sélectionner toutes les colonnes sauf une?

Supposons que ma table ressemble à quelque chose comme:

Col1 Col2 Col3.....Col20 Col21

Maintenant, je veux sélectionner tout sauf Col21. Je veux le changer en unix_timestamp () avant de l'insérer dans une autre table. L'approche triviale consiste donc à faire quelque chose comme:

INSERT INTO newtable partition(Col21) 
SELECT Col1, Col2, Col3.....Col20, unix_timestamp() AS Col21
FROM oldTable

Existe-t-il un moyen de réaliser cela dans la ruche? Merci beaucoup pour votre aide!

7
Rocking chief

Essayez de configurer la propriété ci-dessous

set Hive.support.quoted.identifiers=none;

Sélectionnez ensuite toutes les colonnes sauf col_21:

select `(col_21)?+.+` from <table_name>; 

Pour plus d'informations, reportez-vous au lien this .

Ensuite, l'insertion de l'instruction sera

insert into <tablename> partition (col21) 
select `(col_21)?+.+` from ( --select all columns from subquery except col21
select *, unix_timestamp() AS alias_col21 from table_name --select *, create new col based on col21
)a;

En utilisant cette approche, vous allez avoir alias_col21 comme dernière colonne de votre instruction select afin de pouvoir partitionner en fonction de cette colonne.

En cas de jointures:

Nous ne pouvons pas référencer des colonnes individuelles ((t1.id)?+.+ .. etc) de chaque table, donc supprimez les colonnes inutiles dans l'instruction select.

Hive>insert into <tablename> partition (col21)
select * from (
       select t1.* from
         (--drop col21 and create new alias_col21 by using col21
          select `(col21)?+.+`, unix_timestamp() AS alias_col21 from table1
         ) t1 
    join table2 t2 
  on t1.<col-name>=t2.<col-name>)a;
7
Shu