当前位置: 首页 > 知识库问答 >
问题:

如何通过在hive分区表中选择另一个列来覆盖列值

孙嘉悦
2023-03-14

嗨,如何通过在hive中选择相同的分区表来覆盖列值。

我通过执行以下查询创建了表

CREATE TABLE user (fname string,lname string) partitioned By (day int);

在将数据插入表后,我插入数据。我执行了选择查询,如下所示:

AA  AA  20170201
BB  BB  20170201
CC  CC  20170201
DD  DD  20170202
EE  EE  20170203

根据我的要求,我想在我添加的以下查询的帮助下,在我的表(用户)中再添加一列。

ALTER TABLE user ADD COLUMNS ( day2 int);

添加列后,我的表格如下所示

AA  AA  NULL    20170201
BB  BB  NULL    20170201
CC  CC  NULL    20170201
DD  DD  NULL    20170202
EE  EE  NULL    20170203

但我想要这样的桌子。

AA  AA  20170201    20170202
BB  BB  20170201    20170202
CC  CC  20170201    20170202
DD  DD  20170202    20170202
EE  EE  20170203    20170203

所以我执行了以下查询。

insert overwrite table user partition (day)
select
    fname,
    lname,
    day as day2,
    case 
        when day <= 20170202 then 20170202
        when day > 20170202 then day
    end as day
from user;

然后我执行了如下选择查询

select * from user;

结果是:

AA  AA  NULL    20170201
BB  BB  NULL    20170201
CC  CC  NULL    20170201
AA  AA  NULL    20170202
BB  BB  NULL    20170202
CC  CC  NULL    20170202
DD  DD  NULL    20170202
EE  EE  NULL    20170203

为什么我得到空值。可以请让我知道我错过了什么,让如何实现这一点

   AA   AA  20170201    20170202
    BB  BB  20170201    20170202
    CC  CC  20170201    20170202
    DD  DD  20170202    20170202
    EE  EE  20170203    20170203

共有1个答案

萧宏峻
2023-03-14

遵循分区 Hive 表的行为,HiVE 的架构定义在分区级别进行维护。因此,较旧的分区可能尚未收到架构更新。

详细查询

hive> drop table test_insert;
OK
hive> CREATE TABLE test_insert (fname string,lname string) partitioned By (day int);
OK
hive> insert into test_insert partition (day=20170202) values('f','l');
OK
hive> insert into test_insert partition (day=20170203) values('f','l');
OK
hive> select * from test_insert;
OK
f   l   20170202
f   l   20170203
Time taken: 0.148 seconds, Fetched: 2 row(s)
hive> ALTER TABLE test_insert ADD COLUMNS ( day2 int);
OK
Time taken: 0.193 seconds
hive> select * from test_insert;
OK
   f    l   NULL    20170202
   f    l   NULL    20170203

此时,请注意分区表的模式是在分区级别维护的,应该遵循分区模式,而不是表模式。

请注意此处列中的差异。ALTER未更改现有分区的列定义。

  hive> describe formatted test_insert;
    OK
    # col_name              data_type               comment             

    fname                   string                                      
    lname                   string                                      
    day2                    int                                         

    # Partition Information      
    # col_name              data_type               comment             

    day                     int    

    hive> describe formatted test_insert partition (day=20170202);
    OK
    # col_name              data_type               comment             

    fname                   string                                      
    lname                   string                                      

    # Partition Information      
    # col_name              data_type               comment             

    day                     int                           

修改了上面的查询,创建了新的分区,这样模式将从表中复制到新创建的分区中。

 hive> insert overwrite table test_insert partition (day)
        > select
        >     fname,
        >     lname,
        >     day as day2,
        >     case 
        >         when day <= 20170202 then 19999999
        >         when day > 20170202 then day
        >     end as day
        > from test_insert;


    hive> select * from test_insert;
    OK
    f   l   20170202    19999999
    f   l   NULL    20170202
    f   l   NULL    20170203
    Time taken: 0.224 seconds, Fetched: 3 row(s)

希望这很清楚。!如果您想更改所有现有分区的架构,请尝试以下命令,然后尝试插入。

ALTER TABLE test_insert  partition(day) ADD COLUMNS ( day2 string);
 类似资料:
  • 问题内容: 我有一个包含许多列的表,例如: 表A : 我如何像下面这样插入表B? 表B : 谢谢! 问题答案: 您也可以为此使用普通的UNPIVOT。 使用表变量的示例: 返回值:

  • 问题内容: 如何使用JOIN从一个表中选择所有列,从另一个表中仅选择一些列?在MySQL中。 问题答案: 只需使用表名: 这将选择所有列和列和从。

  • 我想在选择另一个select元素的一个选项时显示一个select元素,在选择另一个选项时隐藏它。 这是JavaScript: 感谢任何帮助。谢谢

  • 问题内容: 我有2个表,一个包含我需要的最终结果,另一个包含我需要根据设定级别选择的列列表。 例如 : 所以,如果我做以下 然后,基本上我需要使用此select语句中的列名来确定从另一条语句中选择了哪些列。 香港专业教育学院尝试过的方法,我当然知道这是错的,但可以让我对我试图做的事情有所了解。 我试图以一种动态方式构建一个sql查询,该查询可以通过我放在表中的任何列进行更改。 从理论上讲,这应与以

  • 我有这个,它绑定了一个变更事件。在其内部值的中,我想在另一个选择列表中选择一个特定的元素,即其中的一个特定选项。 然而它并不起作用。在主服务中有一些服务,如果选择了子服务,就不需要子服务,因此应该选择默认的。 null null

  • 问题内容: 我的表是: 我需要选择每个包含的最大值。 结果将是: 我试过了: 不起作用 尽管数据库保留187个,但结果集有130行。结果包括的一些重复项。 没有。提供所有记录。 具有各种结果。 问题答案: 你好亲密!您需要做的就是选择住所及其最大日期时间,然后再加入到两个字段的表中:

  • 问题内容: 尝试通过一些非常有限的知识和经验来进行SQL查询。尝试了很多我通过搜索发现的内容,但没有得出我想要的结果。 我有四个表: 回复:KITS-[KIT_NO]和[ITEM_NO]都位于ITEMS表中。它们的串联是PK。 我想选择ORDERS,ORDERS.DATE,ORDER_DETAILS.ITEM_NO,ITEMS.DESC 没问题。一些简单的内部联接,我在路上。 困难在于在selec

  • 嗨,我想通过使用mutate函数来创建一个新变量Foldchange。但是我想使用来自同一列的值来计算这个值。有没有什么方法可以计算一个新变量,从同一列中折叠更改,而无需重新排列表格,这样表格就不需要拆分了? 下面是一个清晰的例子: 我想要的输出类似于使用: 获取 显然,我不能使用此代码基于V1和V2变量进行选择,但这只是为了说明。我希望通过这种方式,我可以保持我的附加表的完整性,折叠更改将具有重