【问题标题】:Change column type in hive更改配置单元中的列类型
【发布时间】:2016-04-25 09:55:11
【问题描述】:

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

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

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

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

    你可以试试这个:

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

    【讨论】:

      【解决方案2】:

      数据库(我在 Teradata 工作)通常不允许将列数据类型从高阶修改为低阶,或者数据类型可能与已存储/将存储在表中的数据发生冲突的情况。

      Eg-1:我们可以将int 列修改为double 列,因为新修改的数据类型能够处理表中已经存在的数据。其中将double 列修改为int 可能会产生问题,因为int 列无法保存double 数据。

      Eg-2: 任何(几乎)列都可以修改为字符串数据类型,因为这种数据类型能够容纳范围广泛的数据。任何 double,float,int 类型的数据都可以表示为字符串,因此这种转换在大多数情况下都会被接受。

      Eg-3: 我遇到的另一种情况是 CHARCHAR 的转换有时会失败。何时以及为什么?仅当您尝试降低长度时它才会失败(CHAR(20)CHAR(10))但是当您尝试升级时会正常(CHAR(10)CHAR(20))。如果表中的数据长度大于新的数据类型长度,此检查将保持数据不会被截断的数据完整性。

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

      【讨论】:

      • 非常感谢!我现在终于明白了! :D
      【解决方案3】:

      String to intdouble to int 无法转换。

      您可以参考Allowed Implicit Conversions in Hive

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

      【讨论】:

        【解决方案4】:

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

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

        简单地说,如果没有特定代码,您无法将“较大”类型转换为“较小”类型。

        【讨论】:

          【解决方案5】:

          字符串到 int 的转换是不可能的,因为字符串包含字符并且不能将它们转换为 int。 在 Hive 中无法将 Double 转换为 int,因为数据可能会在转换中丢失。

          例如:假设列类型是 int 并且值是

          1

          2

          3

          如果我们想将列类型转换为双精度,那么值将被转换如下。

          1.0

          2.0

          3.0

          即使转换后也不会丢失数据。

          但是列数据类型是double,让值是

          1.2

          2.0

          3.5

          4.1

          并且我们希望列 int 这些值将被转换为

          1

          2

          3

          4

          很明显,数据会丢失。这就是为什么 hive 不允许加倍到 int 转换的原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多