有没有一种方法可以改变Hive表中列的类型?

33

当前的模式是:

hive> describe tableA;
OK
id      int
ts      timestamp

我想将ts列更改为BIGINT,但不想删除表格并重新创建。这可行吗?


3
另外,如果您正在使用分区,则必须执行“alter table {table_name} partition column ({column_name} {column_type})”操作。Hive很容易产生许多不一致性。也许只有我这样认为,但是Hive让人非常沮丧 :-( - Kenji Noguchi
3个回答

70

2
@interskh,有没有办法在一个语句中应用到多个列?例如 ALTER TABLE tableA CHANGE a,b,c a,b,c BIGINT; 我尝试使用逗号分隔列,但它不起作用。我问这个问题的原因是我的表是使用Hue界面为hive创建的,并且“DECIMAL”默认为“(10,0)”,但我需要“(38,0)”。 - AM_Hawk
你知道如果数据存储为ORC或Parquet是否也能够工作吗? - Stefan Papp
1
请勿使用Parquet格式数据,如果您的Hive版本低于1.2。据说这个问题在Hive 1.2中已经修复,但是我们公司使用的是1.1版本。我不得不删除我的表并重新开始。 - Climbs_lika_Spyder

35
ALTER TABLE table_name CHANGE col_name col_name newType

16

通常在Hive中修改现有表格很简单,只需使用以下语法。

ALTER TABLE table_name CHANGE old_col_name new_col_name new_data_type

在这里,您可以同时更改列名和数据类型。如果您不想更改列名,请确保旧列名和新列名相同。好的。

现在来解决您的问题。如果您想将ts列更改为BIGINT,则表示您正在更改列类型。因此,只需运行此查询即可。

ALTER TABLE tableA CHANGE ts ts BIGINT;

这里的ts和ts是一样的,意思是你不改变列名,而是改变列类型;如果你想同时改变列名,只需运行它即可。

ALTER TABLE tableA CHANGE ts new_col BIGINT;

现在运行

hive> 描述表A;
OK
id      int
new_col      bigint

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