【问题标题】:Hive 1.1.0 Alter table partition type from int to stringHive 1.1.0 将表分区类型从 int 更改为 string
【发布时间】:2015-07-17 12:54:47
【问题描述】:

我有一个表,它有一个 int 类型的分区,但我想将其转换为字符串。但是,我不知道该怎么做。

表格说明为:

Col1 timestamp
Col2 string
Col3 string
Col4 string
Part_col int

# Partition information
# col_name data_type comment

Part_col int

我创建的分区是 Part_col=0, Part_col=1, ..., Part_col=23

我想将它们更改为 Part_col='0' 等

我在 hive 中运行这个命令:

set hive.exec.dynamic.partitions = true;
Alter table tbl_name partition (Part_col=0) Part_col Part_col string;

我也尝试过使用“partition (Part_col)”一次更改所有分区。

我收到错误“列引用 Part_col 无效”

我正在使用来自https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types 的示例来转换十进制列,但无法弄清楚 dec_column_name 代表什么。

谢谢

【问题讨论】:

    标签: hadoop hive partitioning ddl


    【解决方案1】:

    一点点挖掘发现有一个配置单元 JIRA 有一个用于更新分区列数据类型的命令 (https://issues.apache.org/jira/browse/HIVE-3672)

    alter table {table_name} partition column ({column_name} {column_type});
    

    根据JIRA,该命令已实现,但很明显它从未记录在 Hive Wiki 上。

    我在我的 Hive 0.14 系统上使用它,它按预期工作。

    【讨论】:

      【解决方案2】:

      我认为你应该重新定义表的模式,并重新定义你的分区值不再是整数,现在这将是一个字符串类型。

      我建议你做的是:

      1. 将您的表设为外部表(如果您将其定义为非外部表)。在这种情况下,您可以删除表而不删除目录中的数据。
      2. 放下桌子。
      3. 使用新架构(分区值作为字符串)再次创建表。

      上述步骤,物理上(结构文件夹)不会对您已有的结构产生任何影响。区别在于 Hive 元存储,特别是在创建分区时创建的“虚拟列”。

      另外,现在改为进行如下查询:part_col = 1,现在您将能够进行如下查询:part_col = '1'。

      试试这个,告诉我这是怎么回事。

      【讨论】:

      • 太棒了!这行得通。我很好奇如何使用 alter table 语句来做到这一点。我只有几个分区,所以这并不太难。但我可以想象一个有大量列的情况。是的,您可能可以编写一个程序或脚本来执行此操作,但命令不应该“正常工作”吗?在一行中做到这一点会很漂亮。
      • @ChrisNjuguna 考虑一下,您告诉元存储您的表已按特定列分区,并且该列是 int。现在您已经定义了表模式,您可以添加或删除您想要的所有分区,但它们将是“字符串”类型。我认为做你想做的最好的方法就是做我告诉你的,一旦你定义了新的表模式,你可以运行命令 msck repair table (cwiki.apache.org/confluence/display/Hive/…
      • 谢谢@dbustosp 我得到了你的解决方案,这是一个完美的快速解决我的情况。但是,根据我发布的 URL 中的文章,可以使用单个命令更改分区数据类型。我想你会同意这可能是最好的方法。请记住,分区列完全独立于数据,因此我应该能够在不删除和重新创建表和分区的情况下执行此操作。请查看我在原始问题中发布的链接。为什么“更改表分区”命令不起作用?我做错了吗?
      猜你喜欢
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多