我有下表:
CREATE EXTERNAL TABLE aggregate_status(
m_point VARCHAR(50),
territory VARCHAR(50),
reading_meter VARCHAR(50),
meter_type VARCHAR(500)
)
PARTITIONED BY(
insert_date VARCHAR(10))
STORED AS PARQUET
LOCATION '<the s3 route>/aggregate_status'
TBLPROPERTIES(
'parquet.compression'='SNAPPY'
)
我希望在不丢失数据的情况下将reading_meter
列更改为reading_mode
,
ALTER TABLE
有效,但字段现在显示null
。
我不是我正在处理的Hadoop环境的所有者,因此set parquet.column.index.access = true
等更改属性将被丢弃。
如有任何帮助,我们将不胜感激。谢谢
设法找到了一个解决方案,至少对于短数据量。
- 创建表的备份,列名称已更改
CREATE TABLE aggregate_status_bkp AS
SELECT
m_point,
territory,
reading_meter AS reading_mode,
meter_type,
insert_date
FROM aggregate_status
- 执行ALTER TABLE
ALTER TABLE aggregate_status CHANGE COLUMN reading_meter reading_mode VARCHAR (50)
- 从备份到原始的INSERT OVERWRITE
--You might need to temporarily disable strict partition mode depending on your case, this is safe since it's only a lock.
--set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE aggregate_status PARTITION(insert_date)
SELECT
m_point,
territory,
reading_mode,
meter_type,
insert_date
FROM aggregate_status_bkp;
--set hive.exec.dynamic.partition.mode=strict;
我们想要防止动态分区插入的另一种情况是,用户可能会在没有指定一个静态分区的情况下意外地将所有分区指定为动态分区,而其初衷只是覆盖一个根分区的子分区。我们定义了另一个参数hive.exec.dynamic.partition.mode=strict来防止全动态分区的情况。
请参阅https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-查询和插入数据
- 可选完成后删除备份表
DROP TABLE aggregate_status_bkp;