Hive DML数据操纵语言

  DML (Data Manipulation Language) 数据定义语言。DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)更新(update)删除(delete),是开发人员日常使用最频繁的操作。

  在 Hive 中,DML 操作只包括插入(insert)删除(delete)。HDFS数据支持插入、删除,虽然也支持数据的更新,但是 HDFS 并不建议这么做,故此处不做更新介绍

  向 HDFS 中插入数据,本文通过导入数据的方式介绍

1.导入数据

Ⅰ.导入数据的三种方式

向 HDFS 中写入数据,一共有3种方式

  1. 通过 Hive,使用 insert 方式插入;
  2. 使用 HDFS 的 put 命令,将文件直接写入到 Hive 指定表文件夹下的方式;
  3. 使用 Hive 提供的 load 命令,将数据导入(推荐使用)

此处标题命名为导入数据,而非插入数据。是因为大数据环境下,数据量非常大。

1. Hive 中使用 insert 方式一条一条插入有些不合理,太慢了;
2. HDFS 的 put 命令,将文件直接上传至 HDFS ,因为 put 方式不会改变元数据信息,所以会导致 Hive 在 select count(*) 时出错;
3. Hive 的 load 命令,将文件通过 hive 方式导入至 HDFS中。load 方式会修改元数据,从而在 select count(*) 时,由于元数据变化,导致 count(*) 计算会走 MR,得出正确的数据条数

load为什么count(*)会走MR?

  在元数据库中,有个TABLE_PARAMS表,表中存储着每个表的一些关键字段。表中存储着 numFIlesnumRows 两个字段。在 Hive 执行 select count(*) 时,如果元数据没有变化,则直接获取 numRows 的数值,此时查询就不会走 MR,直接通过元数据库返回;
在这里插入图片描述
  put 方式上传文件,并不会修改 Hive 的元数据信息,所以在 select count(*) 时会出错。

  采用Hive 提供的 load 上传文件,此时 Hive 是知道上传几个文件的,但是不知道文件中有多少数据,此时元数据中的 numFiles 会被修改,numRows不会变化。然后在执行 select count(*) 时,由于元数据信息有变动,便不会读取 numRows 的数据,转而通过 MR 去重新计算

Ⅱ.load 命令:向表中装载数据

语法:
  load data [local] inpath '数据的 path' [overwrite] into table table_name [partition (partcol1=val1,…)];

字段介绍:
  load data: 表示加载数据
  local: 表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表中
  inpath: 表示加载数据的路径
  overwrite: 表示覆盖表中已有的数据,否则表示追加
  into table: 表示将数据加载到哪张表
  table_name: 表名。将数据加载到具体哪张表(也支持 库名.表名
  partition: 表示将数据上传到指定的分区

说明:
  load 方式,如果文件在 hdfs 上,load 上传会对文件进行移动如果文件在本机,load 上传会对数据文件进行拷贝【数据在 hdfs 上移动是非常快的,因为只需要将 namenode 中文件的路径修改即可,实际文件并未做任何变动】

load 示例:

  1.创建表
   create table test001(id int,name string) row format delimited fields terminated by ',';

  2.load加载数据
   load data local inpath '/xxx/xxx/xxx/student.txt' into table default.student;
   在这里插入图片描述

Ⅲ.通过查询语句向表中插入数据(insert)

需求:
  创建表 m_userm_student,m_user插入数据,使用insert方式,将 id > 5 的数据插入至 m_student 表中

1.创建表m_user
  create table m_user(id int,name string) row format delimited fields terminated by ',';
2.m_user表插入数据
  insert into table m_user values(1,'lili'),(2,'lucy'),(8,'bob'),(9,'james');
3.创建表m_student
  create table m_student like m_user;
4.将id>5的数据,采用insert方式插入m_student表中
  insert into m_student select id,name from m_user where id > 5;
在这里插入图片描述

在这里插入图片描述

Ⅳ.查询语句中创建表并加载数据(As Select)

语句:
create table if not exists m_student
as select id,name from m_user where id > 5;
在这里插入图片描述

Ⅴ. 创建表时通过 Location 指定加载数据路径

在这里插入图片描述

Ⅵ.Import 数据到指定 Hive 表中

提示:不常用,了解即可

注意:使用import方式,需要先用 export 导出后,再将数据导入 (参考:2.数据导出—Ⅳ.export 导出到 HDFS 上)

hive (default)> import table student2 from '/user/hive/warehouse/export/student';

2.数据导出

Ⅰ.insert 导出

1.将查询的结果导出到本地

(请看下面第二种格式化后导出到本地,不格式化不知道分隔符是啥,不方便后期其他项目的使用,建议格式化)

insert overwrite local directory '/opt/module/export/student'
select * from hive.m_student;
在这里插入图片描述

2.将查询的结果,格式化后,导出到本地

insert overwrite local directory '/opt/module/export/student1'
row format delimited fields terminated by ','
select * from hive.m_student;
在这里插入图片描述

3.将查询的结果导出到 HDFS (去掉local即可)

insert overwrite directory '/opt/module/export/student1'
row format delimited fields terminated by ','
select * from hive.m_student;
在这里插入图片描述

Ⅱ.Hadoop 命令导出到本地

将hdfs中的数据student.txt,通过Hadoop导出方式导出至本地

hive (default)> dfs -get /user/hive/warehouse/student/student.txt /opt/module/data/export/student3.txt;

Ⅲ.Hive Shell 命令导出

基本语法:
  hive -e/-f 执行脚本或者语句 > file

将hive -e 执行的结果,直接写入到本地文件

[hadoop@hadoop201 bin]$ hive -e 'select * from default.student;'> /opt/module/hive/data/export/student4.txt;

Ⅳ.export 导出到 HDFS 上

提示:不常用,了解即可

(配合1.数据导入-------Ⅵ.Import 数据到指定 Hive 表中,一起使用)

hive (default)> export table default.student to '/user/hive/warehouse/export/student';

注意:
  export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移

Ⅴ.Sqoop 导出

  Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

待补充

3.删除数据

Ⅰ.清除表中数据(truncate)

注意:truncate 只能删除管理表不能删除外部表中数据

hive (default)> truncate table student;

Ⅱ.通过删表方式删除数据(drop)

注意:drop 只能删除管理表的数据,不能删除外部表中数据

hive (default)> drop table student;

下一篇:Order By、Sort By、Distribute By、Cluster By 使用说明书


博主写作不易,加个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

我不能保证所写的内容都正确,但是可以保证不复制、不粘贴。保证每一句话、每一行代码都是亲手敲过的,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扛麻袋的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值