【问题标题】:Hive How to select all but one column?Hive 如何选择除一列之外的所有列?
【发布时间】:2018-12-16 02:17:27
【问题描述】:

假设我的桌子看起来像:

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 hiveql


    【解决方案1】:

    尝试设置以下属性

    set hive.support.quoted.identifiers=none;
    

    然后选择除col_21:

    之外的所有列
    select `(col_21)?+.+` from <table_name>; 
    

    更多信息请参考this链接。

    那么插入语句就是

    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)?+.+..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;
    

    【讨论】:

    • 谢谢!如果我使用别名,您知道该怎么做吗?例如,SELECT table1.* 除了 Col21 FROM table1 在某些条件下连接 table2。我不想在 table2 中选择任何东西。所以我需要排除table2和Col21。谢谢!
    • 当然..!!请在原始答案中查看我的编辑 in case of joins 部分
    • 我们可以在替换后得到示例位置的列吗?像 col_1,col_2,col_3 我想更改 col_2 和我选择的最终输出应该是 col_1,col_2,col_3 ,而不是 col_1,col_3,col_2
    • @sande,我认为没有办法将列放在同一个位置,但您可以使用列定义 hive variable 并在您的选择中使用该变量 查询。
    【解决方案2】:

    如果您想删除要加入的多个列

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

    【讨论】:

      【解决方案3】:

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

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

      注意:也称为尖引号、反引号、左引号或开引号,反引号或反引号是标点符号 (`)。它与波浪号在同一个美国计算机键盘键上

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2013-03-23
        • 1970-01-01
        • 2013-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        相关资源
        最近更新 更多