在Hive中更改列数据类型

时间:2016-05-28 16:36:57

标签: hive bigdata

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

  

蜂房>描述sales_staging;

     

     

cust_id string prod_num string
  qty int sale_date string

     

sale_id字符串   所用时间:0.151秒,   提取:5行

     

蜂房> alter table sales_staging CHANGE sale_date sale_date DATE;

     

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

     

蜂房>

3 个答案:

答案 0 :(得分:5)

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

ALTER TABLE sales_staging CHANGE sale_date sale_date_new DATE;

参考此Apache Hive Wiki

答案 1 :(得分:2)

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

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

    我有订单表

    描述订单;

    order_id int
    order_date string
    order_customer_id int
    order_status string

    创建了另一个表ordersnew

    描述ordersnew;

    id int
    odate date
    cid int
    ostatus string

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

    插入到ordernew中选择order_id,cast(from_unixtime(unix_timestamp(substring(order_date,1,19),'yyyy-MM-dd HH:mm:ss'))作为时间戳)作为strdate,order_customer_id,order_status来自订单;

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

    请检查here日期转换

答案 2 :(得分:-1)

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

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

alter table sales_staging CHANGE sale_date sale_date TIMESTAMP ;