我在一个Hive表中有数据,并希望将数据加载到另一个hive表中.
源表是reg_logs,它有2个分区,日期和小时.数据每小时加载到此表中.架构是:
CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING, utc_hour STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/raw/reg_logs';
Run Code Online (Sandbox Code Playgroud)
目标表是reg_logs_org我想要做的就是从utc_hour列旁边的reg_logs复制所有数据.
我创建的架构是:(如果我错了,请更正)
CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs_org (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/reg_logs_org';
Run Code Online (Sandbox Code Playgroud)
从reg_logs将数据插入reg_logs_org:
insert overwrite table reg_logs_org
select id, region_code, sum(count), utc_date
from
reg_logs
group by
utc_date, id, region_code
Run Code Online (Sandbox Code Playgroud)
错误信息:
FAILED: SemanticException 1:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'reg_logs_org'
Run Code Online (Sandbox Code Playgroud)
==
Thank you,
Rio
Run Code Online (Sandbox Code Playgroud)
dps*_*dce 22
这是因为您在插入查询中缺少分区信息
insert overwrite table reg_logs_org PARTITION (utc_date)
select id, region_code, sum(count), utc_date
from
reg_logs
group by
utc_date, id, region_code
Run Code Online (Sandbox Code Playgroud)
aku*_*uhn 18
创建表的副本
CREATE TABLE my_table_backup LIKE my_table;
Run Code Online (Sandbox Code Playgroud)
启用动态分区
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.mapred.mode = nonstrict;
Run Code Online (Sandbox Code Playgroud)
复制表格
INSERT OVERWRITE TABLE dim_data_products_cube_backup PARTITION (ds)
SELECT * FROM dim_data_products_cube
WHERE ds = ds;
Run Code Online (Sandbox Code Playgroud)
如果使用严格模式,则需要where子句.
在某些情况下,你可能需要设置hive.exec.dynamic.partition.mode = 不严格 ,能够将数据插入到分区表,例如,
CREATE TABLE hivePartitionedTable
(
c1 int
, c2 int
, c3 string
)
PARTITIONED BY (year int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS SEQUENCEFILE
;
Run Code Online (Sandbox Code Playgroud)
然后这个INSERT将工作:
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO hivePartitionedTable PARTITION (year)
VALUES (1,2,'3', 1999);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48187 次 |
| 最近记录: |