在配置单元中更改列类型

时间:2016-04-25 09:55:11

标签: hadoop hive

我昨天刚刚开始学习hive而且我一直在改变hive中列的类型。我想问一下列类型的更改是否对它们有某种限制因为我只能做特定类型的更改,比如我可以将int转换为double,string转换为double,double转换为string但是我不能将字符串更改为int,double到int。

ALTER TABLE student CHANGE rollno rollno int;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :
rollno

hive> DESCRIBE FORMATTED student
> ;
OK
# col_name              data_type               comment             

rollno                  int                                         
name                    string                                      
phno                    string                                      
city                    string   

    ALTER TABLE student CHANGE rollno rollno double;
OK
Time taken: 0.144 seconds

ALTER TABLE student CHANGE rollno rollno int;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :

rollno

也不能用字符串。所以请指导我找到答案,因为我似乎无法通过谷歌找到任何东西。

5 个答案:

答案 0 :(得分:6)

如果您只想更改列类型,而不是关心隐式转换 例如,旧列类型是错误的。

你可以试试这个:

set hive.metastore.disallow.incompatible.col.type.changes=false;

答案 1 :(得分:2)

无法进行

String to intdouble to int转换。

您可以参考Allowed Implicit Conversions in Hive

无论可能与否,它都会为您提供整个列表。

答案 2 :(得分:1)

点击此链接到页面末尾,有一个表格,您可以执行隐式转换:

Language Types https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

简单地说,你不能转换一个更大的'输入更小的'一个没有特定代码。

答案 3 :(得分:1)

数据库(我在Teradata上工作过)通常不允许将列数据类型从较高阶修改为较低阶,或者数据类型可能与已存储/将存储在表中的数据冲突的情况。 />
Eg-1:我们可以将int列修改为double列,因为新修改的数据类型能够处理表中已有的数据。修改double列到int的位置可能会产生问题,因为int列无法保存double数据。

Eg-2:任何(几乎)列都可以修改为String数据类型,因为此数据类型能够容纳大量数据。任何类型为double,float,int的数据都可以描述为一个字符串,因此大多数时候都会接受这种转换。

例如3:我遇到的另一个案例是CHARCHAR转换有时会失败。何时以及为何?只有在您尝试降低长度(CHAR(20)CHAR(10))时它才会失败,但在尝试升级(CHAR(10)CHAR(20)时)会很好。如果表中的数据长度大于新的数据类型长度,则此检查将保持数据不会被截断的数据。

我有点惊讶为什么Hive会接受从字符串到双精度的转换。我试过这个,当数据类型从字符串转换为double时,它强制为字符串值NULL。

答案 4 :(得分:1)

无法进行字符串到int的转换,因为字符串包含字符而无法将它们转换为int。 在配置单元中无法进行双到int转换,因为转换中的数据可能会丢失。

例如:假设列类型为int且值为

1

2

3

如果我们想将列类型转换为double,则值将按如下方式转换。

1.0

2.0

3.0

即使转换后数据也没有丢失。

但列数据类型为double,值为

1.2

2.0

3.5

4.1

我们希望列为int,这些值将转换为

1

2

3

4

很明显,数据会有所损失。这就是为什么hive不允许加倍转换为int。