首页 > 解决方案 > Hive 如何选择除一列之外的所有列?

问题描述

假设我的表看起来像:

Col1 Col2 Col3.....Col20 Col21

现在我想选择除 Col21 之外的所有内容。在插入其他表之前,我想将其更改为 unix_timestamp() 。因此,简单的方法是执行以下操作:

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

有没有办法在蜂巢中实现这一目标?非常感谢你的帮助!

标签: hivehiveql

解决方案


尝试设置以下属性

set hive.support.quoted.identifiers=none;

然后选择除col_21:

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

有关更多信息,请参阅链接。

然后插入语句将是

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;

通过使用这种方法,您将在 select 语句中将 alias_col21作为最后一列,以便您可以基于该列进行分区。

在连接的情况下:

我们不能从每个表中引用单独的列((t1.id)?+.+..etc),所以在 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;

推荐阅读