打怪升级之小白的大数据之旅(六十四)<Hive旅程第五站:DML基本操作>

Posted GaryLea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打怪升级之小白的大数据之旅(六十四)<Hive旅程第五站:DML基本操作>相关的知识,希望对你有一定的参考价值。

打怪升级之小白的大数据之旅(六十四)

Hive旅程第五站:DML基本操作

上次回顾

上一章,我们学习了Hive的DDL操作,学会如何操作数据库、数据表后,本章我们就要开始学习如何将数据导入到表中,如何将数据从表中导出

DML操作

我将数据的查询单独抽出到下一章,因为查询是hive的核心内容,本章的DML主要就是数据的导入和导出

数据导入

向表中装载数据

语法格式

load data [local] inpath '数据的path' [overwrite] into table test [partition (partcol1=val1,)];

参数说明:

  • load data:表示加载数据

  • local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

  • inpath:表示加载数据的路径

  • overwrite:表示覆盖表中已有数据,否则表示追加

  • into table:表示加载到哪张表

  • test:表示具体的表

  • partition:表示上传到指定分区
    示例:

  • 测试数据,创建两个测试文件用于测试

    vim /opt/module/hive/dbdata/test/test3.txt
    1	hello
    2	java
    3	hadoop
    4	hive
    
    vim /opt/module/hive/dbdata/test/test4.txt
    1111	aaaa
    2222	bbbb
    3333	dddd
    
  • 创建表并导入数据

    -- 创建两张表,分别用于本地和hdfs加载数据
    create table test4(id int, name string) row format delimited fields terminated by '\\t';
    
    create table test5(id int, name string) row format delimited fields terminated by '\\t';
    

直接加载本地文件到hive test4表中

-- 加载本地文件到test4表中
load data local inpath "/opt/module/hive/dbdata/test/test3.txt" into table test4;
  • HDFS中显示如下:
    在这里插入图片描述

上传文件到HDFS,并加载HDFS中的文件到test5表中

-- 将test4.txt文件上传到HDFS根目录中
hadoop fs -put "/opt/module/hive/dbdata/test/test4.txt" /

-- 直接将test3.txt文件上传到test5表中
hadoop fs -put "/opt/module/hive/dbdata/test/test3.txt" /

-- 加载刚刚上传的根目录中的test4.txt文件到test5表中
load data inpath '/user/hadoopuser/test4.txt' into table test5
-- 查看数据
select * from test5;
  • 上传test4.txt到根目录时:
    在这里插入图片描述
  • 上传test3.txt到test5表后:
    在这里插入图片描述
  • 加载test4.txt到表中后,此时先不加载test3.txt数据
    在这里插入图片描述
  • 我们可以发现,存储在根目录中的test4.txt文件不见了,它自动存储到了test5表中
    在这里插入图片描述
  • 我们使用select * 查看,发现没有load 加载的test3.txt数据同样可以显示出来
    在这里插入图片描述

加载数据覆盖表中已有的数据

-- 再次上传test4.txt 文件到hdfs中,然后对test4表中数据进行覆盖
load data inpath '/user/hadoopuser/test4.txt' overwrite into table test4;
  • 这几种上传的区别:
    • 本地加载数据无需上传数据到hdfs中,直接load后,数据就会保存到hdfs中
    • 使用hdfs上传后,不使用overwrite的时候,会有两种情况
      • 如果上传到非表的路径下,那么它无法读取到数据,必须load,当load后,它会将该数据的路径修改到表中
      • 如果上传到表的路径下,那么它可以读取到上传的数据
    • 使用overwrite后,原数据会直接被覆盖掉

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

  • 创建一张表
    create table test6(id int, name string) row format delimited fields terminated by '\\t';
    

基本模式插入数据

insert into table  test6 values(1,'wangwu'),(2,'zhaoliu');

根据查询结果插入数据

insert into table test6
select id, name from test5 where id = 1;

insert overwrite table test6
select id, name from test5 where id < 3;

注意:

  • insert into:以追加数据的方式插入到表或分区,原有数据不会删除
  • insert overwrite:会覆盖表中已存在的数据

查询语句中创建表并装载数据

根据查询结果创建表(查询结果会直接添加到新创建的表中)

create table if not exists test7
as select id, name from test5;

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

  • 在hdfs中创建一个文件夹,并上传数据到该文件夹中
    hadoop fs -mkdir /test8
    hadoop fs -put "/opt/module/hive/dbdata/test/test4.txt" /test8
    
  • 创建表,并指定数据在hdfs上的位置
    create external table if not exists test8 (id int, name string) row format delimited fields terminated by '\\t' location '/test8';
    

这里大家注意一下,数据一定要创建一个文件夹,并且文件夹中的文件(数据) 格式要一致,不然会报错

Import数据指定Hive表中

Import数据指定Hive表中

  • 因为export导出的数据里面包含了元数据,因此import要导入的表不可以存在,否则报错
  • 先用export导出后,再将数据导入
import table test9 from '/user/hive/warehouse/export/export1';

数据导出

  • 数据导出实际上就是使用insert写出到指定的路径中
  • 使用Insert操作后的文件名称是一个序列号
  • 数据导出的时候,必须使用参数overwrite,不能使用insert into

Insert导出

将查询的结果导出到本地,我在测试数据文件夹下创建一个专门存放导出数据的文件夹export, 路径指定后,它会根据路径创建一个文件夹

insert overwrite local directory '/opt/module/hive/dbdata/export/test8 
select * from test8;

将查询的结果格式化导出到本地

insert overwrite local directory '/opt/module/hive/dbdata/export/test8' 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' 
select * from test5;

将查询的结果导出到HDFS上(没有local)

insert overwrite directory '
/export/test8' 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' 
select * from test5;

Hadoop命令导出数据

使用 get 命令直接从hadoop上拉取数据

hadoop fs -get /user/hive/warehouse/test.db/test5/test4.txt
/opt/module/hive/dbdata/export/export1.txt;

Hive Shell命令导出数据

hive -e 'select * from test.test6;' > /opt/module/hive/dbdata/export/export2.txt;

Export导出数据到HDFS上

导出的数据包含两个文件,一个是存储数据本身的dada文件夹,一个是存储元数据信息的_metadata

export table test.test8 to '/user/hive/warehouse/export/export1';
  • export和import主要用于两个Hadoop平台集群之间Hive表迁移,不能直接导出的本地
    在这里插入图片描述

Sqoop导出

这个导出方式我会专门进行讲解,它一个用于将hive数据导出到数据库中的工具

总结

本章的DML基本操作就介绍到这里,下一章开始就是hive的重点了,不论是查询还是分区表、分桶表,函数,都是我们日常工作中必不可少的能力,所以大家学习完后面的知识,要经常练习我Hive开篇中的那个练习题

以上是关于打怪升级之小白的大数据之旅(六十四)<Hive旅程第五站:DML基本操作>的主要内容,如果未能解决你的问题,请参考以下文章

打怪升级之小白的大数据之旅(六十)<Hive旅程中的始发站>

打怪升级之小白的大数据之旅(六十)<Hive旅程中的始发站>

打怪升级之小白的大数据之旅(六十一)<Hive旅程第二站:Hive安装>

打怪升级之小白的大数据之旅(六十一)<Hive旅程第二站:Hive安装>

打怪升级之小白的大数据之旅(六十二)<Hive旅程第三站:Hive数据类型>

打怪升级之小白的大数据之旅(六十二)<Hive旅程第三站:Hive数据类型>