将 Hive External Table 列名更改为大写并添加新列

Change Hive External Table Column names to upper case and add new columns

我有一个外部 table 例如 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)更改列名,然后向其中添加新列。但问题是我没有这个 table 的任何备份,它包含大量数据。如果出现任何问题,我可能会丢失数据。

我可以创建一个新的外部 table 并迁移数据,一个分区一个分区地从 dump_table 迁移到 dump_table_2 吗?这次迁移的查询是什么样的?

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

您可以使用新列创建新的 table 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