将 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_table
到dump_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 外部表列名称更改为大写并添加新列的主要内容,如果未能解决你的问题,请参考以下文章