Hive如何选择除了一个列以外的所有列?

15

假设我的表格看起来像这样:

Col1 Col2 Col3.....Col20 Col21

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

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

我能在hive中实现这个吗?非常感谢您的帮助!

3个回答

25

请尝试设置以下属性

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;

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

在连接情况下:

我们无法从每个表中引用单个列((t1.id)?+.+..等),因此在选择语句中删除不必要的列。

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;

谢谢!如果我使用别名,你知道如何做吗?例如,SELECT table1.* except Col21 FROM table1 join table2 on some condition。虽然我不想选择table2中的任何内容,但我需要排除table2和Col21。谢谢! - Rocking chief
当然可以!请查看我在原回答的“连接”部分所做的编辑。 - notNull
我们能否在替换后的样本位置获取列,例如 col_1、col_2、col_3。我想更改 col_2,并且我的选择最终输出应该是 col_1、col_2、col_3,而不是 col_1、col_3、col_2。 - sande
1
@sande,我认为没有办法让列处于同一位置,但是你可以定义一个带有列的hive变量,并在你的选择查询中使用该变量 - notNull

3

如果您想删除在其上进行联接的多个列

select
    tb1.*,
    tb2.`(col1|col2)?+.+`
from
     tb1 left join tb2 on
    tb1.col1 = tb2.col1
    and tb1.col2 = tb2.col2

0

由于使用错误的特殊字符,我们大多数人可能无法正常工作。我们应该使用反引号字符(`)而不是单引号或任何其他字符。

select `(name_of_col_to_be_ignored)?+.+`  from table_name;

注意:反引号又称为锐音符、重音符、左单引号或开引号,是一种标点符号(`)。它位于与波浪号相同的美国计算机键盘上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接