一、使用条件

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

最新文章

  1. Apk去掉签名以及重新签名的方法
  2. 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0
  3. HQL的语言
  4. 通过 HTTP 头进行 SQL 注入
  5. Linux递归删除文件命令
  6. 设计模式之桥接模式(Bridge)--结构模型
  7. css自定义动画在微信中无法执行的原因
  8. keras04 - 阿狗阿猫识别 面向对象编程
  9. 题解-GXOI/GZOI2019 特技飞行
  10. 3. 原子变量-CAS算法
  11. Java基础 变量的作用域
  12. django 403问题
  13. python接口自动化测试二十六:使用pymysql模块链接数据库
  14. pytorch变量
  15. linux系统管理 计划任务
  16. 《FPGA全程进阶---实战演练》第四章之实验平台软硬件使用简介
  17. 统计过程控制与评价 Cpk、SPC、PPM
  18. vue 过渡效果
  19. Ubuntu16.04.2安装Tensorflow
  20. nginx-vod-module &amp;&amp; docker &amp;&amp; docker-compose 测试

热门文章

  1. Win8 Metro(C#)数字图像处理--2.55OSTU法图像二值化
  2. C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入
  3. Android零基础入门第22节:ImageView的属性和方法大全
  4. ArchLinux 安装记录
  5. MySQL 常用数据存储引擎区别
  6. 在Windows IoT上生成和识别二维码
  7. MySQL 主从配置 读写分离
  8. Dev C++ 工程没有调试信息 解决办法
  9. 怎么看待php 面向对象思想
  10. localstorage实现带过期时间的缓存功能