Hive 常用DML操作

2023-11-01

一、加载文件数据到表

1.1 语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] 
INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
  • LOCAL 关键字代表从本地文件系统加载文件,省略则代表从 HDFS 上加载文件:
  • 从本地文件系统加载文件时, filepath 可以是绝对路径也可以是相对路径 (建议使用绝对路径);

  • 从 HDFS 加载文件时候,filepath 为文件完整的 URL 地址:如 hdfs://namenode:port/user/hive/project/ data1

  • filepath 可以是文件路径 (在这种情况下 Hive 会将文件移动到表中),也可以目录路径 (在这种情况下,Hive 会将该目录中的所有文件移动到表中);

  • 如果使用 OVERWRITE 关键字,则将删除目标表(或分区)的内容,使用新的数据填充;不使用此关键字,则数据以追加的方式加入;

  • 加载的目标可以是表或分区。如果是分区表,则必须指定加载数据的分区;

  • 加载文件的格式必须与建表时使用 STORED AS 指定的存储格式相同。

使用建议:

不论是本地路径还是 URL 都建议使用完整的。虽然可以使用不完整的 URL 地址,此时 Hive 将使用 hadoop 中的 fs.default.name 配置来推断地址,但是为避免不必要的错误,建议使用完整的本地路径或 URL 地址;

加载对象是分区表时建议显示指定分区。在 Hive 3.0 之后,内部将加载 (LOAD) 重写为 INSERT AS SELECT,此时如果不指定分区,INSERT AS SELECT 将假设最后一组列是分区列,如果该列不是表定义的分区,它将抛出错误。为避免错误,还是建议显示指定分区。

1.2 示例

新建分区表:

  CREATE TABLE emp_ptn(
    empno INT,
    ename STRING,
    job STRING,
    mgr INT,
    hiredate TIMESTAMP,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2)
    )
    PARTITIONED BY (deptno INT)   -- 按照部门编号进行分区
    ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

从 HDFS 上加载数据到分区表:

LOAD DATA  INPATH "hdfs://hadoop001:8020/mydir/emp.txt" OVERWRITE INTO TABLE emp_ptn PARTITION (deptno=20);

emp.txt 文件可在本仓库的 resources 目录中下载

加载后表中数据如下,分区列 deptno 全部赋值成 20:

二、查询结果插入到表

2.1 语法

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

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] 
select_statement1 FROM from_statement;
  • Hive 0.13.0 开始,建表时可以通过使用 TBLPROPERTIES(“immutable”=“true”)来创建不可变表 (immutable table) ,如果不可以变表中存在数据,则 INSERT INTO 失败。(注:INSERT OVERWRITE 的语句不受 immutable 属性的影响);

  • 可以对表或分区执行插入操作。如果表已分区,则必须通过指定所有分区列的值来指定表的特定分区;

  • 从 Hive 1.1.0 开始,TABLE 关键字是可选的;

  • 从 Hive 1.2.0 开始 ,可以采用 INSERT INTO tablename(z,x,c1) 指明插入列;

  • 可以将 SELECT 语句的查询结果插入多个表(或分区),称为多表插入。语法如下:

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

2.2 动态插入分区

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) 
select_statement FROM from_statement;

INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) 
select_statement FROM from_statement;

在向分区表插入数据时候,分区列名是必须的,但是列值是可选的。如果给出了分区列值,我们将其称为静态分区,否则它是动态分区。动态分区列必须在 SELECT 语句的列中最后指定,并且与它们在 PARTITION() 子句中出现的顺序相同。

注意:Hive 0.9.0 之前的版本动态分区插入是默认禁用的,而 0.9.0 之后的版本则默认启用。以下是动态分区的相关配置:

配置 默认值 说明
hive.exec.dynamic.partition true 需要设置为 true 才能启用动态分区插入
hive.exec.dynamic.partition.mode strict 在严格模式 (strict) 下,用户必须至少指定一个静态分区,以防用户意外覆盖所有分区,在非严格模式下,允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 允许在每个 mapper/reducer 节点中创建的最大动态分区数
hive.exec.max.dynamic.partitions 1000 允许总共创建的最大动态分区数
hive.exec.max.created.files 100000 作业中所有 mapper/reducer 创建的 HDFS 文件的最大数量
hive.error.on.empty.partition false 如果动态分区插入生成空结果,是否抛出异常

2.3 示例

  1. 新建 emp 表,作为查询对象表
CREATE TABLE emp(
    empno INT,
    ename STRING,
    job STRING,
    mgr INT,
    hiredate TIMESTAMP,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2),
    deptno INT)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
    
 -- 加载数据到 emp 表中 这里直接从本地加载
load data local inpath "/usr/file/emp.txt" into table emp;

​ 完成后 emp 表中数据如下:

  1. 为清晰演示,先清空 emp_ptn 表中加载的数据:
TRUNCATE TABLE emp_ptn;
  1. 静态分区演示:从 emp 表中查询部门编号为 20 的员工数据,并插入 emp_ptn 表中,语句如下:
INSERT OVERWRITE TABLE emp_ptn PARTITION (deptno=20) 
SELECT empno,ename,job,mgr,hiredate,sal,comm FROM emp WHERE deptno=20;

​ 完成后 emp_ptn 表中数据如下:

  1. 接着演示动态分区:
-- 由于我们只有一个分区,且还是动态分区,所以需要关闭严格默认。因为在严格模式下,用户必须至少指定一个静态分区
set hive.exec.dynamic.partition.mode=nonstrict;

-- 动态分区   此时查询语句的最后一列为动态分区列,即 deptno
INSERT OVERWRITE TABLE emp_ptn PARTITION (deptno) 
SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno FROM emp WHERE deptno=30;

​ 完成后 emp_ptn 表中数据如下:

三、使用SQL语句插入值

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] 
VALUES ( value [, value ...] )
  • 使用时必须为表中的每个列都提供值。不支持只向部分列插入值(可以为缺省值的列提供空值来消除这个弊端);
  • 如果目标表表支持 ACID 及其事务管理器,则插入后自动提交;
  • 不支持支持复杂类型 (array, map, struct, union) 的插入。

四、更新和删除数据

4.1 语法

更新和删除的语法比较简单,和关系型数据库一致。需要注意的是这两个操作都只能在支持 ACID 的表,也就是事务表上才能执行。

-- 更新
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]

--删除
DELETE FROM tablename [WHERE expression]

4.2 示例

1. 修改配置

首先需要更改 hive-site.xml,添加如下配置,开启事务支持,配置完成后需要重启 Hive 服务。

<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
</property>
<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
</property>
<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.in.test</name>
    <value>true</value>
</property>

2. 创建测试表

创建用于测试的事务表,建表时候指定属性 transactional = true 则代表该表是事务表。需要注意的是,按照官方文档 的说明,目前 Hive 中的事务表有以下限制:

  • 必须是 buckets Table;
  • 仅支持 ORC 文件格式;
  • 不支持 LOAD DATA …语句。
CREATE TABLE emp_ts(  
  empno int,  
  ename String
)
CLUSTERED BY (empno) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true");

3. 插入测试数据

INSERT INTO TABLE emp_ts  VALUES (1,"ming"),(2,"hong");

插入数据依靠的是 MapReduce 作业,执行成功后数据如下:

4. 测试更新和删除

--更新数据
UPDATE emp_ts SET ename = "lan"  WHERE  empno=1;

--删除数据
DELETE FROM emp_ts WHERE empno=2;

更新和删除数据依靠的也是 MapReduce 作业,执行成功后数据如下:

五、查询结果写出到文件系统

5.1 语法

INSERT OVERWRITE [LOCAL] DIRECTORY directory1
  [ROW FORMAT row_format] [STORED AS file_format] 
  SELECT ... FROM ...
  • OVERWRITE 关键字表示输出文件存在时,先删除后再重新写入;

  • 和 Load 语句一样,建议无论是本地路径还是 URL 地址都使用完整的;

  • 写入文件系统的数据被序列化为文本,其中列默认由^A 分隔,行由换行符分隔。如果列不是基本类型,则将其序列化为 JSON 格式。其中行分隔符不允许自定义,但列分隔符可以自定义,如下:

    -- 定义列分隔符为'\t' 
    insert overwrite local directory './test-04' 
    row format delimited 
    FIELDS TERMINATED BY '\t'
    COLLECTION ITEMS TERMINATED BY ','
    MAP KEYS TERMINATED BY ':'
    select * from src;
    

5.2 示例

这里我们将上面创建的 emp_ptn 表导出到本地文件系统,语句如下:

INSERT OVERWRITE LOCAL DIRECTORY '/usr/file/ouput'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
SELECT * FROM emp_ptn;

导出结果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive 常用DML操作 的相关文章

随机推荐

  • 前后端分离实现审核功能

    一 前言 在实际开发中 审核功能是一个非常常用的功能 例如管理后台的文章审核等等 本篇博文将介绍如何基于SpringBoot Vue的前后端分离技术实现审核功能 二 项目准备 本项目使用的技术栈为 前端 Vue ElementUI 后端 S
  • 【Web3 系列开发教程——创建你的第一个 NFT(6)】为 NFT 设置价格

    我想作为 NFT 的创建者 你可能有意将你的 NFT 出售给你的 NFT 爱好者 为此 我们需要为 NFT 定价 一般有两种主要的定价方式 在智能合约内定价 本文所讲 在 NFT 市场或平台上列出你的 NFT 更流行的方法 在智能合约内设置
  • 03-Mybatis增删改查的简单功能实现

    增删改查的实现 在上文中已经建立了mybatis的环境 并且创建了UserMapper xml userMapper 并且完成了一个简单的查询操作 已经可以成功的运行 环境可以正常的跑起来了 下面对整个数据库的基础操作 增删改查的代码进行编
  • elementUI+Vue+json-server做简单的文章后台管理

    elementUI Vue json server做简单的文章后台管理 最近刚接触elementUI不久 为了加深学习理解 便利用elementUI做了个简单练习 在CSDN上写记录一下学习过程 顺便整理回顾一下整个过程 创建项目 vue
  • Android Broadcast注册、发送、接收流程随笔

    Broadcast的注册过程 要动态注册广播 需要调用registerReceiver方法 它在ContextWrapper中实现 会调用mBase registerReceiver方法 mBase具体指向ContextImpl regis
  • java技术总结

    1 js 中正则表达式写法 var 注意不要加引号 加了引号就是一个字符串 不加引号才是正则对象 var new RegExp 此处不可以有 等效于Java写法 2 关于jquery中的 1 是jquery类 的别称 相当于java中的ob
  • 攻防世界web新手-simple_php

    文章目录 XCTF simple php 知识点 源码分析 解题思路 XCTF simple php 题目编号 GFSJ0485 知识点 本题主要考察php的弱类型比较 源码分析
  • 华为鸿蒙系统无缝更新,华为鸿蒙系统已陆续推送! 安卓系统可无缝升级: 升级包容量高达6GB...

    相信大家都知道 自从华为手机业务遭受到芯片断供危机以后 也是直接将会把重点放在软件系统层面 很多花粉们都纷纷期待 华为鸿蒙OS系统早日转正的一天 而华为终端CEO余承东表示 华为鸿蒙OS系统将会在四月份迎来首次推送升级 而华为Mate X2
  • python split(),os.path.split()和os.path.splitext()函数用法

    文章来源 https blog csdn net T1243 3 article details 80170006 coding utf 8 author lei import os os path join 将分离的部分合成一个整体 fi
  • 订单枚举实例

    摘要 订单状态 public enum OrderState 摘要 不限制 All 0 摘要 待付款 UnPaid 1 摘要 已取消 Cancel 2 摘要 待确认 Process 3
  • 【Linux】网络层 — IP协议

    Linux 博客主页 一起去看日落吗 分享博主的在Linux中学习到的知识和遇到的问题 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 看似不起波澜的日复一日 一定会在某一天让你看见坚持的意义 祝我们都能在鸡零狗碎里找
  • ServerSocket实现超简单HTTP服务器

    1 相关知识简介 HTTP协议 HTTP是常用的应用层协议之一 是面向文本的协议 HTTP报文传输基于TCP协议 TCP协议包含头部与数据部分 而HTTP则是包含在TCP协议的数据部分 如下图 HTTP报文本质上是一个TCP报文 数据部分携
  • librdkafka的安装和使用

    安装 下载https github com edenhill librdkafka 预备环境 The GNU toolchain GNU make pthreads zlib optional for gzip compression su
  • SSL连接的JAVA实现

    SSL连接分为双向认证和单向认证 其中双向认证表示服务器和客户端都需要分别校验对方的身份 单向认证则只需要客户端校验服务器的身份 SSL的双向认证的流程如下图 从以上流程可见 要完成双向认证 服务器端和客户端都需要验证对方的证书 然后再进行
  • Android configChanges属性和configChanges()方法总结

    简介 在Android系统默认的情况下 Configuration改变都会销毁并重建当前Activity 例如当 屏幕方向 或 键盘显示隐藏 变化时 如果不希望重新创建Activity实例 可以在manifest xml文件中可以指定参数a
  • 2019年数学建模美赛经验总结

    北京时间2019年1月29号上午9时 数模美赛结束 美赛结束已经10多天了 我在这次竞赛中负责建模和编程 趁现在记忆还比较清晰 写下这篇博客记录第一次参加数学建模美赛的经历 补更 2019年4月20日公布成绩 笔者最终获得了美赛一等奖 目录
  • 主流加密方式和工具比较

    相关术语 缩写 全称 描述 CryFS CryFS 一种安全的文件加密的工具 Fuse框架 Filesystem In UserSpace 一个实现在用户空间的文件系统框架 loop loop 像块设备一样访问一个文件 dev mapper
  • 字符串压缩(三)之短字符串压缩

    一 通用算法的短字符压缩 开门见山 我们使用一段比较短的文本 Narrator It is raining today So Peppa and George cannot play outside Peppa Daddy it s sto
  • 直接使用ip和数据库实例名登录PL/SQL

    以往我一直以为登录PLSQL的时候 除了固定的用户密码以外 需要先用ORACLE的客户端配置本地服务 然后再登录PLSQL的时候 DataBase选项选择配置的本地服务名 今天因为一位同事的win10机器无法安装oracle客户端 因此 在
  • Hive 常用DML操作

    一 加载文件数据到表 1 1 语法 LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION partcol1 val1 partcol2 val2 L