我昨天刚开始学习Hive,我被困在改变Hive列的类型。我想问一下列类型的改变是否对它们有某种限制,因为我只能做特定类型的改变,比如我可以将int转换成double,string转换成double,double转换成string,但是我不能将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条答案
按热度按时间e3bfsja21#
按照此链接到页面末尾,有一个表,其中包含可以执行的隐式转换:
语言类型https://cwiki.apache.org/confluence/display/hive/languagemanual+types
简单地说,如果没有特定的代码,就无法将“较大”类型转换为“较小”类型。
2w3rbyxf2#
String to int
或者double to int
无法转换。您可以在配置单元中引用允许的隐式转换。
它会给你所有可能或不可能的东西。
a7qyws3x3#
数据库(我在teradata上工作过)通常不允许将列数据类型从高阶修改为低阶,或者数据类型可能与表中已存储/将存储的数据冲突。
我们可以修改一个
int
列到adouble
列作为新修改的数据类型能够处理表中已经存在的数据。其中作为修改double
列到int
可能会产生问题,因为int
列不能容纳double
数据。eg-2:任何(几乎)列都可以修改为字符串数据类型,因为这个数据类型能够容纳大量的数据。任何类型为double、float、int的数据都可以被描述为字符串,因此这种转换在大多数情况下都是可以接受的。
我遇到的另一个例子是
CHAR
至CHAR
有时转换失败。什么时候?为什么?只有当你试图降低长度时,它才会失败CHAR(20)
至CHAR(10)
)但当你尝试升级(CHAR(10)
至CHAR(20)
). 如果表中的数据长度大于新的数据类型长度,此检查将在不允许截断数据的情况下保持数据健全性。我有点惊讶为什么Hive会接受从字符串到双精度的转换。我尝试了这个方法,当数据类型从string转换为double时,它强制字符串值为null。
lo8azlld4#
如果您只想更改列类型,而不关心隐式转换,例如,旧的列类型是错误的。
你可以试试这个:
mm5n2pyu5#
无法进行字符串到整数的转换,因为字符串包含字符并且无法将其转换为整数。在配置单元中无法进行双精度到整数的转换,因为转换过程中数据可能会丢失。
例如:假设列类型是int,值是
1
2
三
如果要将列类型转换为double,则值将按以下方式转换。
1
2
3
即使在转换之后,数据也不会丢失。
但是列数据类型是double,让值
1.2
2
3.5
4.1
我们希望列int这些值将被转换为
1
2
三
4
所以很明显数据会丢失。这就是为什么不允许配置单元进行双精度到整数的转换。