[ Hive ] 数据加载和插入

本文详细介绍了Hive中的1DML Load数据加载(包括本地/HDFS、动态分区、inputformat等)、2DML Insert数据插入(如insert+select、多重插入、动态分区和目录导出)以及事务处理的基本概念、原理和局限性。适合Hive初学者和数据分析师参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 DML-Load加载数据

产生映射的方式:

  1. 将数据文件移到表对应文件夹下
  2. 建表时使用location关键字指定数据文件路径
  3. 官方推荐使用load命令将数据加载到表中,加载操作本质上是将数据文件移动到与Hive表对应的位置的纯复制/移动操作
-- 加载语法
-- 使用local关键字从本地文件系统(服务端)加载为纯复制,不使用则从hdfs上加载为移动
-- 使用overwrite关键字,则filepath中的内容会替代目标表/分区中的所有内容
-- 加载到表/分区(手动指定静态分区)
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename 
[PARTITION (partcol1=val1, partcol2=val2 ...)]

-- 动态分区,将加载语句自动重写为insert as select,因此数据文件中最后一个字段变为虚拟的分区字段
-- 要求filepath中的数据文件最后一个字段作为动态分区字段
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename 

-- 配合inputformat使用
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename 
[PARTITION (partcol1=val1, partcol2=val2 ...)] 
[INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

2 DML-Insert插入数据

2.1 insert+select

INSERT INTO|OVERWRITE TABLE tablename1 
[PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] 
select_statement1 FROM from_statement;

2.2 multiple inserts多重插入

一次扫描,多次插入。其功能就是减少扫描的次数

------------multiple inserts----------------------
-- 当前库下已有一张表student
select * from student;
--创建两张新表
create table student_insert1(sno int);
create table student_insert2(sname string);
-- 多重插入
from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;

2.3 dynamic partition insert动态分区插入

-- 动态分区插入
-- 1、首先设置动态分区模式为非严格模式 默认已经开启了动态分区功能
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;

-- 2、当前库下已有一张表student
select * from student;

-- 3、创建分区表 以sdept作为分区字段
--注意:分区字段名不能和表中的字段名重复。
create table student_partition(Sno int,Sname string,Sex string,Sage int) partitioned by(Sdept string);

-- 4、执行动态分区插入操作
insert into table student_partition partition(Sdept) select Sno,Sname,Sex,Sage,Sdept from student;

2.4 insert + directory导出数据

-- 将select查询的结果导出成文件存放在文件系统中
-- 标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
    [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...

3 事务

3.1 介绍

  1. hive作为数据仓库,是分析数据规律的,而不是创造数据规律的

  2. Hive映射的数据通常存储于HDFS上,而HDFS是不支持随机修改文件数据

  3. Hive0.14版本开始,具有ACID语义的事务(支持INSERT,UPDATE和 DELETE这些用例)

  4. 使用事务解决如下问题:

    1)流式传输数据

    2)变化缓慢的维度数据

    3)数据更新

  5. 基本原理:

    1)用HDFS文件作为原始数据(基础数据),用delta保存事务操作的记录增量数据;

    2)正在执行中的事务,是以一个staging开头的文件夹维护的,执行结束就是delta文件夹。每次执行一次事务操作都会有这样的一个delta增量文件夹;

    3)当访问Hive数据时,根据HDFS原始文件和delta增量文件做合并,查询最新的数据。

3.2 原理

  1. INSERT语句会直接创建delta目录;
    DELETE目录的前缀是delete_delta;
    UPDATE语句采用了split-update特性,即先删除、后插入;

  2. 每个事务的delta文件夹下都有两个文件:

    1)事务版本号文件

    2)包含数据内容的桶文件,该文件以orc格式存储

  3. 合并器:

    1)随着表数据的修改,将越来越多的delta增量文件合并

    2)将一个或多个增量文件和基础文件重写为新的基础文件

3.3 局限性

  1. 不支持BEGIN,COMMIT和ROLLBACK。所有语言操作都是自动提交的。
  2. 仅支持ORC文件格式(STORED AS ORC)。
  3. 默认情况下事务配置为关闭。需要配置参数开启使用。
  4. 表必须是分桶表(Bucketed)才可以使用事务功能。外部表无法创建事务表。
  5. 表参数transactional必须为true;
  6. 将hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
  7. 事务表不支持LOAD DATA …语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值