将 Hive 外部表列名称更改为大写并添加新列

Posted

技术标签:

【中文标题】将 Hive 外部表列名称更改为大写并添加新列【英文标题】:Change Hive External Table Column names to upper case and add new columns 【发布时间】:2020-06-07 13:16:01 【问题描述】:

我有一个外部表,例如dump_table,它按年、月和日进行分区。如果我运行show create table dump_table,我会得到以下信息:

CREATE EXTERNAL TABLE `dump_table`
(
  `col_name` double,
  `col_name_2` timestamp
  )
PARTITIONED BY (
  `year` int,
  `month` int,
  `day` int)
CLUSTERED BY (
  someid)
INTO 32 BUCKETS
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://somecluster/test.db/dump_table'
TBLPROPERTIES (
  'orc.compression'='SNAPPY',
  'transient_lastDdlTime'='1564476840')

我必须将其列更改为大写并添加新列,因此它将变为:

CREATE EXTERNAL TABLE `dump_table_2`
(
  `COL_NAME` DOUBLE,
  `COL_NAME_2` TIMESTAMP,
  `NEW_COL` DOUBLE
  )
PARTITIONED BY (
  `year` int,
  `month` int,
  `day` int)
CLUSTERED BY (
  someid)

选项:1

作为一个选项,我可以运行Change(DDL 参考here)来更改列名,然后向其中添加新列。但问题是我没有这个表的任何备份,它包含很多数据。如果出现任何问题,我可能会丢失数据。

我可以创建一个新的外部表并从dump_tabledump_table_2 逐个分区迁移数据吗?此迁移的查询将是什么样子?

有没有更好的方法来实现这个用例?请帮忙

【问题讨论】:

在旧版本的 Hive 中,不可能有除小写以外的列名:***.com/a/57183048/2700344。也许新版本的一切都已经改变了......我怀疑它 @leftjoin 谢谢!所以基本上我能做的就是创建一个旧表的副本,包含新列并将数据迁移到该新表。 【参考方案1】:

您可以使用新列创建新表 dump_table_2 并使用 sql 加载数据:

set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table dump_table_2 partition (`year`, `month`, `day`)
select col1, 
       ...
       colN,
       `year`, `month`, `day`
  from dump_table_1 t --join other tables if necessary to calculate columns

【讨论】:

还有一件事,如果我不指定 col 列表,所有相同的列都将被迁移,并且 null 将被插入到不匹配的列中,对吗?因为两个表中的列数不相等 @Dakait 您需要指定列列表,因为它是位置的。列将按位置加载,而不是按名称加载。分区列应位于列表的最后。只有当 select * 在相同位置返回相同的列时,您才能使用它 select * 在我的情况下将仅返回位于相同位置的列的子集,例如前 10 列。我只对前 10 列感兴趣。我可以指定源和目标中的列列表吗?感谢您的帮助和时间。 @Dakait select col1, col2....colN, NULL as someothercol, NULL as onemoreCol .. partition cols are last 完美,我现在明白了。感谢您的帮助。

以上是关于将 Hive 外部表列名称更改为大写并添加新列的主要内容,如果未能解决你的问题,请参考以下文章

hive外部表分区

雪花外部表:添加新列

Hive内部表、外部表、分区表、桶表概述

将徽标上的 php 链接更改为外部站点

C# 实体框架向来自外部库的实体添加新列

如何将登录从外部文件更改为循环?