文章目录

  • Hive——HiveQL数据操作
    • 1.向管理表中插入数据
    • 2.通过查询语句向表中插入数据
    • 3.单个查询语句中创建表并加载数据
    • 4.导出数据

Hive——HiveQL数据操作

1.向管理表中插入数据

Hive没有行级别的数据插入,数据更新和删除操作,那么往表中装载数据上的唯一途径就是使用一种数据装载操作,或者通过其他方式仅仅将文件写到正确目录下。

0: jdbc:hive2://192.168.142.92:10000/default> show PARTITIONS employees;
+-----------------------------+
|          partition          |
+-----------------------------+
| country=China/state=Xian    |
| country=USA/state=Illinois  |
+-----------------------------+

#向分区表中插入数据
LOAD DATA LOCAL INPATH '/root/Illinois-emps'
OVERWRITE INTO TABLE employees
PARTITION (country="US",state="Illinois")

如果分区目录不存在会优先创建分区目录,然后在将数据拷贝到该目录下,如果目标表不是分区表,应当省略PARTITION子句。

LOCAL关键字指明了是本地文件系统路径;如果数据源存在与本地文件系统中,数据源将会被拷贝到目标位置,如果没有LOCAL关键字,则数据源位于HDFS文件系统中,数据源将会被移动到目标位置。

0: jdbc:hive2://pseudo01:10000/default> desc stus;
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| id                       | int                   |                       |
| name                     | string                |                       |
| cls                      | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| cls                      | string                |                       |
+--------------------------+-----------------------+-----------------------+

准备数据:

ClsA.txt
1101,张三
1102,李四
1103,王五
1104,赵六
1105,翠花
----------------------------------------------------------------------------------------------------------
ClsB.txt
1201,胡一刀
1202,胡一筒
1203,楚留香
1204,张翼德
1205,张承恩
1206,王晓二
----------------------------------------------------------------------------------------------------------
ClsC.txt
1301,时迁
1302,武松
1303,李逵
1304,宋江
1305,林冲

向管理表中插入数据

0: jdbc:hive2://pseudo01:10000/default> LOAD DATA LOCAL INPATH '/root/cls/ClsA.txt' INTO TABLE stus PARTITION (cls='ClsA');
No rows affected (4.364 seconds)
0: jdbc:hive2://pseudo01:10000/default> LOAD DATA LOCAL INPATH '/root/cls/ClsB.txt' INTO TABLE stus PARTITION (cls='ClsB');
No rows affected (0.977 seconds)
0: jdbc:hive2://pseudo01:10000/default> LOAD DATA LOCAL INPATH '/root/cls/ClsC.txt' INTO TABLE stus PARTITION (cls='ClsC');
No rows affected (0.916 seconds)
0: jdbc:hive2://pseudo01:10000/default> SELECT id,name,cls FROM stus;
+-------+-------+-------+
|  id   | name  |  cls  |
+-------+-------+-------+
| 1101  | 张三    | ClsA  |
| 1102  | 李四    | ClsA  |
| 1103  | 王五    | ClsA  |
| 1104  | 赵六    | ClsA  |
| 1105  | 翠花    | ClsA  |
| 1201  | 胡一刀   | ClsB  |
| 1202  | 胡一筒   | ClsB  |
| 1203  | 楚留香   | ClsB  |
| 1204  | 张翼德   | ClsB  |
| 1205  | 张承恩   | ClsB  |
| 1206  | 王晓二   | ClsB  |
| 1301  | 时迁    | ClsC  |
| 1302  | 武松    | ClsC  |
| 1303  | 李逵    | ClsC  |
| 1304  | 宋江    | ClsC  |
| 1305  | 林冲    | ClsC  |
+-------+-------+-------+
16 rows selected (0.539 seconds)
0: jdbc:hive2://pseudo01:10000/default> dfs -ls -R /user/hive/warehouse/stus;
+----------------------------------------------------+
|                     DFS Output                     |
+----------------------------------------------------+
| drwxr-xr-x   - root supergroup          0 2019-07-02 07:13 /user/hive/warehouse/stus/cls=ClsA |
| -rwxr-xr-x   1 root supergroup         63 2019-07-02 07:13 /user/hive/warehouse/stus/cls=ClsA/ClsA.txt |
| drwxr-xr-x   - root supergroup          0 2019-07-02 07:14 /user/hive/warehouse/stus/cls=ClsB |
| -rwxr-xr-x   1 root supergroup         94 2019-07-02 07:14 /user/hive/warehouse/stus/cls=ClsB/ClsB.txt |
| drwxr-xr-x   - root supergroup          0 2019-07-02 07:15 /user/hive/warehouse/stus/cls=ClsC |
| -rwxr-xr-x   1 root supergroup         63 2019-07-02 07:15 /user/hive/warehouse/stus/cls=ClsC/ClsC.txt |
+----------------------------------------------------+
6 rows selected (0.022 seconds)

如果用户指定了OVERWRITE关键字,那么将会覆盖式插入数据(原先的数据将不复存在)。

LOAD DATA LOCAL INPATH '/root/cls/ClsB.txt' OVERWRITE INTO TABLE stus PARTITION (cls='ClsA');

2.通过查询语句向表中插入数据

INSERT语句允许用户通过查询语句向目标表中插入数据。

1.首先我们创建一张表

0: jdbc:hive2://pseudo01:10000/default> CREATE TABLE IF NOT EXISTS students(
. . . . . . . . . . . . . . . . . . . > id int,
. . . . . . . . . . . . . . . . . . . > name string,
. . . . . . . . . . . . . . . . . . . > cls string)
. . . . . . . . . . . . . . . . . . . > row format delimited
. . . . . . . . . . . . . . . . . . . > fields terminated by ',';
No rows affected (0.157 seconds)
0: jdbc:hive2://pseudo01:10000/default> desc students;
+-----------+------------+----------+
| col_name  | data_type  | comment  |
+-----------+------------+----------+
| id        | int        |          |
| name      | string     |          |
| cls       | string     |          |
+-----------+------------+----------+
3 rows selected (0.103 seconds)

2.通过查询语句向表重插入数据

0: jdbc:hive2://pseudo01:10000/default> INSERT INTO TABLE students SELECT * FROM stus s WHERE s.cls='ClsA';
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
No rows affected (39.398 seconds)
0: jdbc:hive2://pseudo01:10000/default> SELECT * FROM students;
+--------------+----------------+---------------+
| students.id  | students.name  | students.cls  |
+--------------+----------------+---------------+
| 1201         | 胡一刀            | ClsA          |
| 1202         | 胡一筒            | ClsA          |
| 1203         | 楚留香            | ClsA          |
| 1204         | 张翼德            | ClsA          |
| 1205         | 张承恩            | ClsA          |
| 1206         | 王晓二            | ClsA          |
+--------------+----------------+---------------+
6 rows selected (0.392 seconds)

使用OVERWRITE关键字代替INTO关键字向表中插入数据,会覆盖原有数据;

0: jdbc:hive2://pseudo01:10000/default> INSERT OVERWRITE TABLE students SELECT * FROM stus s LIMIT 2,5;
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
No rows affected (46.986 seconds)
0: jdbc:hive2://pseudo01:10000/default> SELECT * FROM students;
+--------------+----------------+---------------+
| students.id  | students.name  | students.cls  |
+--------------+----------------+---------------+
| 1205         | 张承恩            | ClsA          |
| 1204         | 张翼德            | ClsA          |
| 1203         | 楚留香            | ClsA          |
+--------------+----------------+---------------+
3 rows selected (0.355 seconds)

扫描一次数据向表中多个分区插入数据

FROM src_table src
INSERT OVERWRITE TABLE dest_table
PARTITION(field1='a1',field2='a2',...)
SELECT * WHERE src.field1='a1' and src.field2='a2'
INSERT OVERWRITE TABLE dest_table
PARTITION(field1='b1',field2='b2',...)
SELECT * WHERE src.field1='b1' and src.field2='b2'
INSERT OVERWRITE TABLE dest_table
PARTITION(field1='c1',field2='c2',...)
SELECT * WHERE src.field1='c1' and src.field2='c2';

动态分区插入

Hive提供了一个动态分区功能,其可以基于查询参数推断出需要创建的分区名称。

1.创建分区表

CREATE TABLE IF NOT EXISTS stus01(
id int,
name string)
PARTITIONED BY (cla string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

2.开启动态分区功能

0: jdbc:hive2://pseudo01:10000/default> set hive.exec.dynamic.partition.mode=nonstrict;
No rows affected (0.021 seconds)

3.使用动态分区向stus01中插入数据

INSERT OVERWRITE TABLE stus01
PARTITION (cla)
SELECT s.id,s.name,s.cls
FROM stus s;
0: jdbc:hive2://pseudo01:10000/default> SHOW PARTITIONS stus01;
+------------+
| partition  |
+------------+
| cla=ClsA   |
| cla=ClsB   |
| cla=ClsC   |
+------------+
3 rows selected (0.438 seconds)
0: jdbc:hive2://pseudo01:10000/default> SELECT * FROM stus01;
+------------+--------------+-------------+
| stus01.id  | stus01.name  | stus01.cla  |
+------------+--------------+-------------+
| 1201       | 胡一刀          | ClsA        |
| 1202       | 胡一筒          | ClsA        |
| 1203       | 楚留香          | ClsA        |
| 1204       | 张翼德          | ClsA        |
| 1205       | 张承恩          | ClsA        |
| 1206       | 王晓二          | ClsA        |
| 1201       | 胡一刀          | ClsB        |
| 1202       | 胡一筒          | ClsB        |
| 1203       | 楚留香          | ClsB        |
| 1204       | 张翼德          | ClsB        |
| 1205       | 张承恩          | ClsB        |
| 1206       | 王晓二          | ClsB        |
| 1201       | 胡一刀          | ClsC        |
| 1202       | 胡一筒          | ClsC        |
| 1203       | 楚留香          | ClsC        |
| 1204       | 张翼德          | ClsC        |
| 1205       | 张承恩          | ClsC        |
| 1206       | 王晓二          | ClsC        |
+------------+--------------+-------------+
18 rows selected (0.339 seconds)

源表分区字段名与目标表分区字段名不同,由此,我们可以看出源表字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配的。

当然我们也可以混合使用动态分区和静态分区

INSERT OVERWRITE TABLE dest_table
PARTITION (field1='a1',field2)
SELECT ...,src.f1,src.f2
FROM src_table src
WHERE se.f1 = 'a1';

字段field1使用了静态分区,field2使用了动态分区。

注意:静态分区键必须出现在动态分区键之前。

动态分区功能默认情况下是没有开启的。开启后,默认是以“严格”模式执行的,在这种模式下至少要求有一列分区字段是静态的。

动态分区属性

属性名称 默认值 描述
hive.exec.dynamic.partition false 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode strict 设置成nostrict,表使允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 每个mapper或reducer可以创建的最大动态分区个数,超出则会抛出错误
hive.exec.max.dynamic.partitions +1000 一个动态分区语句可以创建的最大动态分区个数
hive.exec.max.created.files 100000 全局可以创建的最大文件个数。

3.单个查询语句中创建表并加载数据

CREATE TABLE IF NOT EXISTS stus02
AS SELECT id,name
FROM stus;
0: jdbc:hive2://pseudo01:10000/default> select * from stus02;
+------------+--------------+
| stus02.id  | stus02.name  |
+------------+--------------+
| 1201       | 胡一刀          |
| 1202       | 胡一筒          |
| 1203       | 楚留香          |
| 1204       | 张翼德          |
| 1205       | 张承恩          |
| 1206       | 王晓二          |
| 1201       | 胡一刀          |
| 1202       | 胡一筒          |
| 1203       | 楚留香          |
| 1204       | 张翼德          |
| 1205       | 张承恩          |
| 1206       | 王晓二          |
| 1201       | 胡一刀          |
| 1202       | 胡一筒          |
| 1203       | 楚留香          |
| 1204       | 张翼德          |
| 1205       | 张承恩          |
| 1206       | 王晓二          |
+------------+--------------+
18 rows selected (0.475 seconds)

注意:这个功能不能用于外部表

4.导出数据

INSERT OVERWRITE LOCAL DIRECTORY '/root/stus'
SELECT id,name,cls
FROM stus;
[root@pseudo01 ~]# ls stus/
000000_0
[root@pseudo01 ~]# cat stus/000000_0
1201胡一刀ClsA
1202胡一筒ClsA
1203楚留香ClsA
1204张翼德ClsA
1205张承恩ClsA
1206王晓二ClsA
1201胡一刀ClsB
1202胡一筒ClsB
1203楚留香ClsB
1204张翼德ClsB
1205张承恩ClsB
1206王晓二ClsB
1201胡一刀ClsC
1202胡一筒ClsC
1203楚留香ClsC
1204张翼德ClsC
1205张承恩ClsC
1206王晓二ClsC

也可以指定多个输出文件夹目录

FROM stus s
INSERT OVERWRITE DIRECTORY '/root/stus/ClsA'
SELECT * WHERE s.cls='ClsA'
INSERT OVERWRITE DIRECTORY '/root/stus/ClsB'
SELECT * WHERE s.cls='ClsB'
INSERT OVERWRITE DIRECTORY '/root/stus/ClsC'
SELECT * WHERE s.cls='ClsC';
0: jdbc:hive2://pseudo01:10000/default> dfs -ls -R /root/stus
+----------------------------------------------------+
|                     DFS Output                     |
+----------------------------------------------------+
| drwxr-xr-x   - root supergroup          0 2019-07-02 08:36 /root/stus/ClsA |
| -rwxr-xr-x   1 root supergroup        120 2019-07-02 08:36 /root/stus/ClsA/000000_0 |
| drwxr-xr-x   - root supergroup          0 2019-07-02 08:36 /root/stus/ClsB |
| -rwxr-xr-x   1 root supergroup        120 2019-07-02 08:36 /root/stus/ClsB/000000_0 |
| drwxr-xr-x   - root supergroup          0 2019-07-02 08:36 /root/stus/ClsC |
| -rwxr-xr-x   1 root supergroup        120 2019-07-02 08:36 /root/stus/ClsC/000000_0 |
+----------------------------------------------------+
6 rows selected (0.048 seconds)
FROM stus s
INSERT OVERWRITE LOCAL DIRECTORY '/root/stus/ClsA'
SELECT * WHERE s.cls='ClsA'
INSERT OVERWRITE LOCAL DIRECTORY '/root/stus/ClsB'
SELECT * WHERE s.cls='ClsB'
INSERT OVERWRITE LOCAL DIRECTORY '/root/stus/ClsC'
SELECT * WHERE s.cls='ClsC';
[root@pseudo01 ~]# tree stus
stus
├── 000000_0
├── ClsA
│   └── 000000_0
├── ClsB
│   └── 000000_0
└── ClsC└── 000000_03 directories, 4 files

HiveQL数据操作相关推荐

  1. Hive学习—数据操作

    第5章 HiveQL:数据操作 第4章主要介绍如何创建表,随之而来的下个问题即,如何装载数据到这些表中. 本章主要讨论Hive查询语言中,向表中装载数据和从表中抽取数据到文件系统的数据操作语言部分. ...

  2. 认识Hive,以及Hive的数据定义与数据操作,hive的数据查询和hive函数

    认识Hive 为什么要出现hive 前面知识我们讲到mapreudce计算框架,各位需要通过java编码的形式来实现设计运算过程,这对各位的编程能力提出了更高的要求,难道没有门槛更低的方式来实现运算的 ...

  3. 全网最细之HiveQL语句操作

    HiveQL语句操作 关键字尽量大写 但是本人小写容易记忆 所以本篇为小写 -------------------------------------------------------------- ...

  4. numpy和torch数据操作对比

    对numpy和torch数据操作进行对比,避免遗忘. ndarray和tensor import torch import numpy as npnp_data = np.arange(6).resh ...

  5. Redis数据库搭建主从同步(主从概念、主从配置、主从数据操作)

    1. 主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读 ...

  6. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  7. MySQL基础篇:数据操作语言DML

    1.概述 数据操作语言(DML)用于插入.修改.删除.查询数据记录,包括以下SQL语句: INSERT:添加数据到数据库中 UPDATE:修改数据库中的数据 DELETE:删除数据库中的数据 2.插入 ...

  8. 逻辑模型三要素-数据操作

    数据操作是指对数据库中各种对象的实例或取值所允许执行操作的集合,其中包括操作方法及有关规则,它是对数据库动态特性的描述.

  9. 使用dplyr进行数据操作(30个实例)

    本文转载自"R语言",已获授权. dplyr软件包是R中功能最强大,最受欢迎的软件包之一.该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包, ...

最新文章

  1. 谷歌将比特币现金汇率纳入货币信息搜索
  2. Windows下如何安装MariaDB
  3. 关于isset的一点说明
  4. 微信公众帐号开发教程第6篇-消息及消息处理工具的封装
  5. 40岁的程序员还能找到工作吗_如果程序员已经到三十岁了,那他还能找到满意的工作吗?...
  6. mysql降级导入_mysql 升级和降级
  7. php前后分离的工作写法,[前后端分离项目]thinkphp返回给前端数据为字符串
  8. 一个简单的iBatis入门例子
  9. 走心地讨论一下,一个中国码农在硅谷求职的实用经历
  10. 《程序开发心理学——银年纪念版》前言
  11. java.util.stream.IntStream
  12. ZStack的VPC特性详解及实战
  13. PuTTY使用复制粘贴
  14. C++学习(二八一)Gradle下载目录里的随机码是什么
  15. 融合通信无人值守系统解决方案
  16. 阿里java开发一面 面试题及个人解析答案
  17. mysql优化工具 MySQL Tuner
  18. Google翻译接口(PHP API)
  19. 计算机网络脆弱性评估技术研究
  20. 耳机接口规则_耳机小白必读 一分钟看懂什么是TRS接口

热门文章

  1. 吃鸡ios和android灵敏度,和平精英抖音燃茶灵敏度分享
  2. RJM8L151 基于额温枪开发资料
  3. ubuntu 获取root权限超简单方法
  4. uV胶点胶机器人_UV胶点胶加工所用UV胶水的特点及优势
  5. 远程计算机时能看吗,其他人使用QQ远程控制我的计算机,对方可以看到我的QQ中的隐私吗?...
  6. MAD-GAN: Multivariate Anomaly Detection for Time Series Data with Generative Adversarial Networks
  7. 孝感市高企培育,湖北省孝感市高企申报对象、流程、奖补
  8. 咸宁市2022年度高企申报认定时间流程、材料指南
  9. 2018香港计算机考试,2018年香港中学文凭考试DSE考场一览
  10. android:高德地图点标记与取消标记