更改配置单元中的列类型

n3h0vuf2  于 2021-05-29  发布在  Hadoop
关注(0)|答案(5)|浏览(690)

我昨天刚开始学习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

弦也不行。所以请引导我走向答案,因为我似乎无法通过谷歌找到任何东西。

e3bfsja2

e3bfsja21#

按照此链接到页面末尾,有一个表,其中包含可以执行的隐式转换:
语言类型https://cwiki.apache.org/confluence/display/hive/languagemanual+types
简单地说,如果没有特定的代码,就无法将“较大”类型转换为“较小”类型。

2w3rbyxf

2w3rbyxf2#

String to int 或者 double to int 无法转换。
您可以在配置单元中引用允许的隐式转换。
它会给你所有可能或不可能的东西。

a7qyws3x

a7qyws3x3#

数据库(我在teradata上工作过)通常不允许将列数据类型从高阶修改为低阶,或者数据类型可能与表中已存储/将存储的数据冲突。
我们可以修改一个 int 列到a double 列作为新修改的数据类型能够处理表中已经存在的数据。其中作为修改 double 列到 int 可能会产生问题,因为 int 列不能容纳 double 数据。
eg-2:任何(几乎)列都可以修改为字符串数据类型,因为这个数据类型能够容纳大量的数据。任何类型为double、float、int的数据都可以被描述为字符串,因此这种转换在大多数情况下都是可以接受的。
我遇到的另一个例子是 CHARCHAR 有时转换失败。什么时候?为什么?只有当你试图降低长度时,它才会失败 CHAR(20)CHAR(10) )但当你尝试升级( CHAR(10)CHAR(20) ). 如果表中的数据长度大于新的数据类型长度,此检查将在不允许截断数据的情况下保持数据健全性。
我有点惊讶为什么Hive会接受从字符串到双精度的转换。我尝试了这个方法,当数据类型从string转换为double时,它强制字符串值为null。

lo8azlld

lo8azlld4#

如果您只想更改列类型,而不关心隐式转换,例如,旧的列类型是错误的。
你可以试试这个:

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

mm5n2pyu5#

无法进行字符串到整数的转换,因为字符串包含字符并且无法将其转换为整数。在配置单元中无法进行双精度到整数的转换,因为转换过程中数据可能会丢失。
例如:假设列类型是int,值是
1
2

如果要将列类型转换为double,则值将按以下方式转换。
1
2
3
即使在转换之后,数据也不会丢失。
但是列数据类型是double,让值
1.2
2
3.5
4.1
我们希望列int这些值将被转换为
1
2

4
所以很明显数据会丢失。这就是为什么不允许配置单元进行双精度到整数的转换。

相关问题