【问题标题】:Alter column data type in Hive在 Hive 中更改列数据类型
【发布时间】:2016-09-26 20:28:57
【问题描述】:

我们需要将表列数据类型从字符串更改为日期。虽然我正在尝试做我得到以下错误。你能帮忙吗?

hive> 描述 sales_staging;

好的

cust_id 字符串 prod_num 字符串
数量 int sale_date 字符串

sale_id 字符串 耗时:0.151 秒, 已获取:5 行

hive> 更改表 sales_staging CHANGE sale_date sale_date DATE ;

FAILED:执行错误,返回代码 1 从 org.apache.hadoop.hive.ql.exec.DDLTask。无法更改表。这 以下列的类型与中的现有列不兼容 他们各自的职位:sale_date

蜂巢>

【问题讨论】:

  • 消息似乎很清楚。您不能将整数更改为日期。也许您应该创建新版本的表并将数据复制到其中。
  • sale_date 字符串,它是一个字符串数据类型。我想更改为日期。请检查并提供帮助。

标签: hive bigdata


【解决方案1】:

您不能为要更改数据类型的列指定相同的名称。像这样使用

ALTER TABLE sales_staging CHANGE sale_date sale_date_new DATE;

参考这个Apache Hive Wiki

【讨论】:

    【解决方案2】:

    您不能将现有的字符串类型数据更改为日期类型。但我们可以通过两种方式解决这个问题。

    1. 创建另一个具有相同列数但数据类型为日期的表,其中您需要将字符串转换为日期的列,然后使用插入命令通过将字符串转换为日期将旧表数据导出到新表。
    2. 向现有表中添加一个新列,数据类型为日期。通过将字符串转换为新列来覆盖表本身。

    例如:

    我有订单表

    描述订单;

    order_id 整数
    订单日期字符串
    order_customer_id 整数
    order_status 字符串

    创建了另一个表ordersnew

    描述新订单;

    id 整数
    约会日期
    cid 整数
    状态字符串

    现在将订单数据导出到 ordersnew 表

    insert into ordersnew select order_id,cast(from_unixtime(unix_timestamp(substring(order_date,1,19), 'yyyy-MM-dd HH:mm:ss')) as timestamp) as strdate, order_customer_id,order_status from orders;

    substring(order_date,1,19), 'yyyy-MM-dd HH:mm:ss' 这是您必须根据数据检查和更改查询的地方。

    请查看here 了解日期转换

    【讨论】:

      【解决方案3】:

      执行以下步骤: 步骤 1) 检查字段“sale_date”中的所有日期是否为有效日期。如果是,则转到步骤 2

      step-2) 检查日期格式,DATE 数据类型格式应为 'yyyy-MM-dd'。如果日期格式是 'yyyy-MM-dd HH:mm:ss' 那么您应该尝试以下语法:

      alter table sales_staging CHANGE sale_date sale_date TIMESTAMP;

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 2013-06-10
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 2021-07-26
        • 1970-01-01
        相关资源
        最近更新 更多