当前位置:   article > 正文

【Hive---06】数据导入 与 数据导出_hive导出数据到本地

hive导出数据到本地

1. 数据导入

1.1 使用 HIve 命令 导入数据

1.1.1 load :将【文件数据】导入表 (官方推荐) ⭐

官方推荐:先清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。

load data [local] inpath '数据的path' [overwrite] 
into table 表名 [partition (partcol1=val1,...)];
  • 1
  • 2
  • local:如果加该字段表示从本地加载数据到表,不加就表示从HDFS加载数据到表。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。
  • inpath :数据的路径。① 可以写绝对路径;②也可以写相对路径;③ 还可以是URI,如 hdfs://namenode:9000/user/hive/project/data1
  • overwrite:是否覆盖表中数据
  • partition:指定加载到哪个分区。

注意:

  1. 从本地上传到hdfs:是复制,不是剪切。因为本质是hadoop dfs -put
  2. 从hdfs到hdfs:是剪切,不是复制。因为本质是hadoop dfs -mv

1.1.2 insert:将【查询数据】导入表 (hive3.0新特性) ⭐

(1) insert + values:一次插入一条数据 (不推荐)

可以像MySQL使用insert+values一条一条直接插入数据,但是执行过程非常非常慢,原因在于底层是使用MapReduce把数据写入Hive表中。【不推荐】

-- 全部字段
insert into table t_test 
values (1,"allen",18);

-- 可以选择插入部分字段
insert into table employees (name, age)
values ('Alice', 18);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
(2) insert + select :一次插入多条数据 ⭐

先将数据清洗成为结构化文件,然后使用load命令将文件数据导入到一个原始表中,最后使用insert+select将原始表中多条数据一次导入到表中。【推荐】

  1. 语法:
    -- 全部字段
    INSERT INTO|OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]]
    select 全部字段 FROM from_statement;
    
    -- 部分字段
    INSERT INTO|OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] (字段1,字段2)
    select 字段1,字段2 FROM from_statement;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. into是追加的写入
    2. overwrite 是覆盖的写入
  2. 例子:
    --创建一张原始表student
    drop table if exists student;
    
    create table student(
    	num int,
    	name string,
    	sex string,
    	age int,
    	dept string
    )
    row format delimited fields terminated by ',';
    
    --将数据加载到原始表中
    load data local inpath '/root/hivedata/students.txt' into table student;
    
    --创建一张目标表
    create table student_from_insert(sno int,sname string);
    
    --使用insert+select插入数据到新表中
    insert into table student_from_insert 
    select num,name from student;
    
    -- 查看数据是否插入成功
    select * from student_from_insert;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
(3) from + insert + select :一次扫描多次插入⭐
  • 功能:减少扫描的次数,在一次扫描中。完成多次insert操作。

    --当前库下已有一张表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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
(4) insert + partition + select:动态分区插入 ⭐
  • 将查询数据导入到分区表中
    --1、开启动态分区并指定模式
    set hive.exec.dynamic.partition = true; -- 开启动态分区
    -- ① strict:值为strict表示为严格模式,那么插入数据并指定分区字段时必须有一个分区字段值静态指定。
    -- ② nonstrict:如果想要插入数据并指定分区字段时每个分区字段都自动指定值,那么使用非严格模式
    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(sdate timestamp, sdept string);
    
    --4、执行动态分区插入操作
    insert into table student_partition 
    partition(sdate='2008-06-08', sdept)
    select num,name,sex,age,dept from student;
    -- insert语句中
    	-- 分区字段 sdate='2008-06-08' 值直接显示给出,故是静态分区
    	-- 分区字段 sdept没有显示给出,故是动态分区
    -- select语句中
    	--其中,num,name,sex,age作为表的字段内容插入表中
    	--因为只有一个动态分区字段,那么select到的字段列表的倒数第一个字段dept的值是做为分区字段值
    
    -- 5. 查看数据是否插入成功
    select * from student_partition
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

1.1.3 creat + as select:创建表时将查询数据导入

create table if not exists student6
as select id,name from student1;
  • 1
  • 2

1.2 使用Hadoop 命令 导入数据

  1. 方式一:使用Hadoop命令将数据导入到hdfs中:

    # 打开Linux终端,在任何地方输入:
    [hao@hadoop111 ~]$ hadoop dfs -put 文件1路径 文件2路径 文件3路径 hdfs路径
    
    • 1
    • 2

    在这里插入图片描述

  2. 方式二:使用web图形化界面将数据导入到hdfs中:
    在这里插入图片描述

注意:从hdfs中导入数据,只是导入真实数据,要与hive的元数据保持一致才能使用。若不一致,则查询不到数据
但可以使用语法进行修复:分区表的分区修复

2. 数据导出

2.1 使用 HIve 命令 导出数据

2.1.1 insert:将查询结果导出 ⭐

(1) insert + select :一次导出多条数据 ⭐
  1. 语法:

    INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’
    [ROW FORMAT row_format] -- 指定分隔符
    [STORED AS file_format] -- 指定存储格式
    SELECT ... FROM ...
    
    • 1
    • 2
    • 3
    • 4

    注意:

    1. 导出操作是一个OVERWRITE覆盖文件夹操作,子文件都会被覆盖,慎重
    2. local:如果加该字段表示将数据下载到本地,不加就表示下载到hdfs。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统
    3. 不指定分隔符,则默认以\001SOH分隔字段。
  2. 例子:

    --当前库下已有一张表student
    select * from student;
    
    --1、导出查询结果到HDFS指定目录下
    insert overwrite directory '/tmp/hive_export/e2' 
    row format delimited fields terminated by ','
    stored as orc
    select * from student;
    
    --2、导出数据到本地文件系统指定目录下
    insert overwrite local directory '/root/hive_export/e1' select * from student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
(2) from + insert + select :一次扫描多次导出 ⭐
  1. 语法:在insert + select基础上,将from...提前即可

    from table_name
    
    INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’
    [ROW FORMAT row_format] -- 指定分隔符
    [STORED AS file_format] -- 指定存储格式
    
    INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’
    [ROW FORMAT row_format] -- 指定分隔符
    [STORED AS file_format] -- 指定存储格式
    
    SELECT ... 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  2. 例子:

    from student
    
    insert overwrite directory '/tmp/hive_export/e2' 
    	row format delimited fields terminated by ','
    	stored as orc
    	select name from student;
    
    insert overwrite directory '/tmp/hive_export/e3' 
    	row format delimited fields terminated by ','
    	select age from student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

2.1.2 export:将表数据导出 ⭐

  • 导出到hdfs

    export table default.student to '/student';
    
    • 1

    export导出来的文件:

    • _metadata文件:存放表的元数据
    • data文件夹:存放表的数据文件

    exportimport 主要用于两个 Hadoop 平台集群之间的 Hive 表迁移。

2.2 使用Hadoop 命令 导出数据

  1. 使用命令从hdfs中导出数据:从hdfs中拉取数据到输入命令的Linux这台主机上

    # 打开Linux终端,在任何地方输入:
    [hao@hadoop111 ~]$ hadoop dfs -get hdfs文件1路径 hdfs文件2路径 本地路径
    
    • 1
    • 2
  2. 使用web图形化界面从hdfs中导出数据:从hdfs中拉取数据到打开web图形化界面的主机(一般是window)
    在这里插入图片描述

注意:从hdfs中导出数据,只是导出真实数据,并没有导出元数据

2.3 Sqoop导出

Sqoop是一个工具,这个后期有专门的blog学习该工具怎么使用,这里不再赘述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/577411
推荐阅读
相关标签
  

闽ICP备14008679号