hive merge into 批量更新测试
2024-08-30 22:38:13
一、使用条件
hive2.2.0及之后的版本支持使用merge into 语法,使用源表数据批量目标表的数据。使用该功能还需做如下配置
1、参数配置
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1;
set hive.auto.convert.join=false;
set hive.merge.cardinality.check=false; -- 目标表中出现重复匹配时要设置该参数才行
2、建表要求
Hive对使用Update功能的表有特定的语法要求, 语法要求如下: (1)要执行Update的表中, 建表时必须带有buckets(分桶)属性 (2)要执行Update的表中, 需要指定格式,其余格式目前赞不支持, 如:parquet格式, 目前只支持ORCFileformat和AcidOutputFormat (3)要执行Update的表中, 建表时必须指定参数('transactional' = true);
DROP TABLE IF EXISTS dim_date_10000;
create table dim_date_10000(
date_key string comment'如:2018-08-08'
,day int comment'日(1~31)'
,month int comment'月,如:8'
,month_name string comment'月名称,如:8月'
,year int comment'年,如:2018'
,year_month int comment'年月,如201808'
,week_of_year string comment'年内第几周 2018-1'
,week int comment'周(1~7)'
,week_name string comment'周,如星期三'
,quarter int comment'季(1~4)'
)
CLUSTERED BY (date_key) INTO 10 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS orc
TBLPROPERTIES('transactional'='true');
3、批量更新语法
MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <``boolean` `expression1>
WHEN MATCHED [AND <``boolean` `expression2>] THEN UPDATE SET <set clause list>
WHEN MATCHED [AND <``boolean` `expression3>] THEN DELETE
WHEN NOT MATCHED [AND <``boolean` `expression4>] THEN INSERT VALUES<value list>
二、批量更新语法对比
对比在hive1.1.0 使用overwrite ,hive2.3.5使用merge into的方式 ,对不同量级的数据进行更新时的语法及效率。
1、更新语法
hive 2.3.5 merge into相较与Hive1.1.0 overwrite 更新方式语法更简洁。
Hive1.1.0
insert overwrite table dim_date_100w
-- 旧的改变了的数据
select t2.date_key,t2.day,t2.month,t2.month_name,t2.year,t2.year_month,t2.week_of_year,t2.week,t2.week_name,1001 as quarter
from dim_date_100w t1
join dim_date_1w t2 on t1.date_key=t2.date_key
-- 旧的不变的数据
union all
select t1.*
from dim_date_100w t1
left join dim_date_1w t2 on t1.date_key=t2.date_key
where t2.date_key is null
-- 新增的数据
union all
select t1.*
from dim_date_1w t1
left join dim_date_100w t2 on t1.date_key=t2.date_key
where t2.date_key is null
;
Hive2.3.5
MERGE INTO dim_date_100w AS T USING dim_date_1w AS S
ON t.date_key=s.date_key
WHEN MATCHED THEN UPDATE SET quarter=1001
WHEN NOT MATCHED THEN INSERT VALUES(S.date_key,S.day,S.month,S.month_name,S.year,S.year_month,S.week_of_year,S.week,S.week_name,S.quarter);
2、更新用时
两种更新方式在10w及10000w时更新用时相差不多,在1000w时Hive2.3.5用时只需Hive1.1.0的一半。
目标表数据量 | 源表数据量 | Hive1.1.0 批量更新用时 | Hive2.3.5 批量更新用时 |
---|---|---|---|
10w条 | 1w | 90s | 80s |
1000W | 1w | 330s | 160s |
1000w | 100w | 340s | 180s |
10000w | 1w | 640s | 610s |
10000w | 100w | 700s | 630s |
最新文章
- Apk去掉签名以及重新签名的方法
- 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0
- HQL的语言
- 通过 HTTP 头进行 SQL 注入
- Linux递归删除文件命令
- 设计模式之桥接模式(Bridge)--结构模型
- css自定义动画在微信中无法执行的原因
- keras04 - 阿狗阿猫识别 面向对象编程
- 题解-GXOI/GZOI2019 特技飞行
- 3. 原子变量-CAS算法
- Java基础 变量的作用域
- django 403问题
- python接口自动化测试二十六:使用pymysql模块链接数据库
- pytorch变量
- linux系统管理 计划任务
- 《FPGA全程进阶---实战演练》第四章之实验平台软硬件使用简介
- 统计过程控制与评价 Cpk、SPC、PPM
- vue 过渡效果
- Ubuntu16.04.2安装Tensorflow
- nginx-vod-module &;&; docker &;&; docker-compose 测试