微信公众号:苏言论
理论联系实际,畅言技术与生活。

文章目录

  • 1 测试的版本
  • 2 insert overwrite使用说明
  • 3 示例
  • 4 建议的操作
  • 5 参考链接

1 测试的版本

Apache hive 1.1.0/2.3.1/3.1.0

2 insert overwrite使用说明

表类型 使用场景 hive操作逻辑
非分区表 insert overwrite table t select col from b 先删除现有数据表目录,再插入新的数据,不存在旧数据保留的情况
分区表 insert overwrite table t partition(part_name=’’) select col from b 先删除现有分区数据目录,再插入新的数据,不存在旧数据保留的情况
分区表 insert overwrite table t select col,part_name from b 只对新数据集中存在数据变更的分区进行覆盖,不涉及数据变更的分区和旧数据会被保留

3 示例

考虑下面的课程安排表数据结构和数据;

drop table class_course_schedule;
create table class_course_schedule(id int,course_name string,course_time date) partitioned by(city string);
insert into class_course_schedule values
(1,'语文','2020-02-01','guangzhou'),
(2,'语文','2020-02-02','guangzhou'),
(10,'语文','2020-02-03','guangzhou'),
(3,'政治','2020-02-01','hangzhou'),
(4,'体育','2020-02-02','hangzhou'),
(5,'英语','2020-02-03','hangzhou'),
(6,'音乐','2020-02-01','shanghai'),
(7,'物理','2020-02-02','shanghai'),
(8,'计算机','2020-02-03','shanghai'),
(9,'画图','2020-02-04','shanghai');select * from class_course_schedule t;
+-------+----------------+----------------+------------+
| t.id  | t.course_name  | t.course_time  |   t.city   |
+-------+----------------+----------------+------------+
| 1     | 语文           | 2020-02-01     | guangzhou  |
| 2     | 语文           | 2020-02-02     | guangzhou  |
| 10    | 语文           | 2020-02-03     | guangzhou  |
| 3     | 政治           | 2020-02-01     | hangzhou   |
| 4     | 体育           | 2020-02-02     | hangzhou   |
| 5     | 英语           | 2020-02-03     | hangzhou   |
| 6     | 音乐           | 2020-02-01     | shanghai   |
| 7     | 物理           | 2020-02-02     | shanghai   |
| 8     | 计算机         | 2020-02-03     | shanghai   |
| 9     | 画图           | 2020-02-04     | shanghai   |
+-------+----------------+----------------+------------+
10 rows selected (1.459 seconds)

对表进行insert overwrite,比如;

insert overwrite table class_course_schedule select * from class_course_schedule where course_name!='语文';

由于city='guangzhou’只有course_name='语文’的数据记录,select返回的数据集中city='guangzhou’分区的数据没有变化,hive从返回的select数据集中删除整个city='guangzhou’分区的情况下进行过滤,所以旧分区(city=‘guangzhou’)没有被重写,数据被保留;

select * from class_course_schedule t;
+-------+----------------+----------------+------------+
| t.id  | t.course_name  | t.course_time  |   t.city   |
+-------+----------------+----------------+------------+
| 1     | 语文           | 2020-02-01     | guangzhou  |
| 2     | 语文           | 2020-02-02     | guangzhou  |
| 10    | 语文           | 2020-02-03     | guangzhou  |
| 3     | 政治           | 2020-02-01     | hangzhou   |
| 4     | 体育           | 2020-02-02     | hangzhou   |
| 5     | 英语           | 2020-02-03     | hangzhou   |
| 6     | 音乐           | 2020-02-01     | shanghai   |
| 7     | 物理           | 2020-02-02     | shanghai   |
| 8     | 计算机         | 2020-02-03     | shanghai   |
| 9     | 画图           | 2020-02-04     | shanghai   |
+-------+----------------+----------------+------------+
10 rows selected (1.459 seconds)

hive按设计工作,因为只需要覆盖所需分区的情况,对于增量分区负载来说是正常的,在这种情况下,无需触摸其它分区;如果覆盖无需更改的分区,则会导致非必要数据丢失,恢复起来可能会非常昂贵
再对表进行insert overwrite;

insert overwrite table class_course_schedule select * from class_course_schedule where course_name!='英语';

由于 course_name='英语’所在的分区city='hangzhou’中course_name非一致数据,select返回的数据集中city='guangzhou’分区的数据有变化,hive对其重写;

+-------+----------------+----------------+------------+
| t.id  | t.course_name  | t.course_time  |   t.city   |
+-------+----------------+----------------+------------+
| 1     | 语文           | 2020-02-01     | guangzhou  |
| 2     | 语文           | 2020-02-02     | guangzhou  |
| 10    | 语文           | 2020-02-03     | guangzhou  |
| 3     | 政治           | 2020-02-01     | hangzhou   |
| 4     | 体育           | 2020-02-02     | hangzhou   |
| 6     | 音乐           | 2020-02-01     | shanghai   |
| 7     | 物理           | 2020-02-02     | shanghai   |
| 8     | 计算机         | 2020-02-03     | shanghai   |
| 9     | 画图           | 2020-02-04     | shanghai   |
+-------+----------------+----------------+------------+
9 rows selected (0.562 seconds)

4 建议的操作

  1. 分区表指定具体分区,减少对不相关分区的影响;
insert overwrite table class_course_schedule partition(city='guangzhou') values
(12,'语文01','2020-02-12'),
(22,'语文02','2020-02-22'),
(19,'语文03','2020-02-19');+-------+----------------+----------------+------------+
| t.id  | t.course_name  | t.course_time  |   t.city   |
+-------+----------------+----------------+------------+
| 12    | 语文01         | 2020-02-12     | guangzhou  |
| 22    | 语文02         | 2020-02-22     | guangzhou  |
| 19    | 语文03         | 2020-02-19     | guangzhou  |
| 3     | 政治           | 2020-02-01     | hangzhou   |
| 4     | 体育           | 2020-02-02     | hangzhou   |
| 6     | 音乐           | 2020-02-01     | shanghai   |
| 7     | 物理           | 2020-02-02     | shanghai   |
| 8     | 计算机         | 2020-02-03     | shanghai   |
| 9     | 画图           | 2020-02-04     | shanghai   |
+-------+----------------+----------------+------------+
9 rows selected (0.574 seconds)
  1. 如果仍然要删除分区,可以删除/重建表(可能需要为此再创建一个中间表),然后将分区加载到其中;或者计算需要单独删除的分区,然后执行ALTER TABLE DROP PARTITION删除分区。

5 参考链接

Inserting datain to HiveTables from queries

Hive insert overwrite 问题相关推荐

  1. hive insert overwrite directory 报错

    hive insert overwrite directory 报错: 2017-06-07T16:56:11,766 ERROR [main]: exec.Task (:()) - Failed w ...

  2. Hive insert overwrite

    Hive之insert into 和insert overwrite hive通常有三种方式对包含分区字段的表进行数据插入 1)静态插入数据:要求插入数据时指定与建表时相同的分区字段,如: inser ...

  3. hive insert into语句 和 insert overwrite语句

    2019独角兽企业重金招聘Python工程师标准>>> 1.insert  into 语句 hive> insert into table userinfos2 select ...

  4. Hive 的insert into 和 insert overwrite

    转载:https://blog.csdn.net/qq_31382921/article/details/70911108 区分insert into 和 insert overowrite:  1. ...

  5. insert overwrite table 后面为什么不能用select *,怎么解决这个bug

    问题:两个同样的表结构的表,如果使用insert overwrite table select *会出现以下错误. hive> insert overwrite table dwd.t_chan ...

  6. insert overwrite table不会覆盖原文件,而是新增一个文件

    目录 一.背景 二.解决 一.背景 hive insert overwrite table结果发现不会覆盖原文件,而是新增一个文件 本来只有一个文件 insert overwrite table之后变 ...

  7. 一文搞定hive之insert into 和 insert overwrite与数据分区

    版权声明:本文为博主原创文章,未经博主允许不得转载. 数据分区 数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区.水平分区是对表 ...

  8. hive分区表之insert overwrite 注意事项

    hive version 3.1.3 以往我们插入分区 需要 insert ovewrite table  p_table partition(period_id='202212') select i ...

  9. hive on spark执行insert overwrite非常慢

    把一些sql执行从hive改到spark,发现执行更慢,sql主要是一些insert overwrite操作,从执行计划看到,用到InsertIntoHiveTable spark-sql> e ...

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(10-6)译 - TPT继承模型中使用存储过程
  2. php for循环执行函数,自执行函数用for结束后面不能访问循环变量
  3. python3 列表倒叙_python的列表、元组、字典、集合
  4. python已停止工作
  5. jquery~ajax()学习
  6. JZOJ 4822. 【NOIP2016提高A组集训第1场10.29】完美标号
  7. (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835
  8. 从零打造在线网盘系统之Hibernate查询与更新技术
  9. Windows下的bat原来可以为我们做很多
  10. 【Java】split()和java.util.StringTokenizer分割字符串的性能比较
  11. for 2018.12.3
  12. 2.应用统计与随机过程第二章部分课上例题(平稳随机、各态历经)
  13. Mac 在 Appstore 下载 hight Sierra 10.13
  14. numpy中takes函数
  15. Tomcat启动时报错:A child container failed during start解决方案-clean
  16. 机器学习系列(三)——目标函数、损失函数以及代价函数
  17. 软考--快速掌握操作系统的PV操作
  18. 为什么复数域中使用共轭转置而不是转置
  19. uni-app引入iconfont图标
  20. 医生提醒:坐办公室一族应1小时活动5分钟

热门文章

  1. Mybatis的if标签
  2. 洛谷试练场入门之“洛谷的第一个任务”讲解
  3. js中event事件
  4. mysql statement讲解_Statement接口详解
  5. idea 配置maven及环境变量配置
  6. MyBatis 使用 Redis 缓存
  7. STM32 FSMC基地址详解
  8. apache hawq
  9. jQuery输入框回车添加标签特效
  10. java.lang.NoClassDefFoundError: org/apache/ibatis/io/Resources