将配置单元外部表列名更改为大写,并添加新列

xoefb8l8  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(398)

例如,我有一个外部表 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)

option:1
作为一个选择,我可以运行 Change (此处为ddl引用)更改列名,然后向其中添加新列。但问题是我没有这个表的任何备份,它包含了大量的数据。如果出了什么问题,我可能会丢失数据。
我可以创建一个新的外部表并从中逐分区迁移数据吗 dump_tabledump_table_2 ? 这个迁移的查询是什么样子的?
有没有更好的方法来实现这个用例?请帮忙

w41d8nur

w41d8nur1#

您可以使用新列创建新表dump\u table\u 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

相关问题