赞
踩
官方推荐:先清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。
load data [local] inpath '数据的path' [overwrite]
into table 表名 [partition (partcol1=val1,...)];
local
:如果加该字段表示从本地加载数据到表,不加就表示从HDFS加载数据到表。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。inpath
:数据的路径。① 可以写绝对路径;②也可以写相对路径;③ 还可以是URI,如 hdfs://namenode:9000/user/hive/project/data1
overwrite
:是否覆盖表中数据partition
:指定加载到哪个分区。注意:
- 从本地上传到hdfs:是复制,不是剪切。因为本质是
hadoop dfs -put
- 从hdfs到hdfs:是剪切,不是复制。因为本质是
hadoop dfs -mv
可以像MySQL使用insert+values
一条一条直接插入数据,但是执行过程非常非常慢,原因在于底层是使用MapReduce把数据写入Hive表中。【不推荐】
-- 全部字段
insert into table t_test
values (1,"allen",18);
-- 可以选择插入部分字段
insert into table employees (name, age)
values ('Alice', 18);
先将数据清洗成为结构化文件,然后使用load命令将文件数据导入到一个原始表中,最后使用insert+select
将原始表中多条数据一次导入到表中。【推荐】
-- 全部字段
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;
into
是追加的写入overwrite
是覆盖的写入
--创建一张原始表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;
功能:减少扫描的次数,在一次扫描中。完成多次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、开启动态分区并指定模式
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
create table if not exists student6
as select id,name from student1;
方式一:使用Hadoop命令将数据导入到hdfs中:
# 打开Linux终端,在任何地方输入:
[hao@hadoop111 ~]$ hadoop dfs -put 文件1路径 文件2路径 文件3路径 hdfs路径
方式二:使用web图形化界面将数据导入到hdfs中:
注意:从hdfs中导入数据,只是导入真实数据,要与hive的元数据保持一致才能使用。若不一致,则查询不到数据
但可以使用语法进行修复:分区表的分区修复
语法:
INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’
[ROW FORMAT row_format] -- 指定分隔符
[STORED AS file_format] -- 指定存储格式
SELECT ... FROM ...
注意:
- 导出操作是一个OVERWRITE覆盖文件夹操作,子文件都会被覆盖,慎重
local
:如果加该字段表示将数据下载到本地,不加就表示下载到hdfs。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。- 不指定分隔符,则默认以
\001
即SOH
分隔字段。
例子:
--当前库下已有一张表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;
语法:在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 ...
例子:
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;
导出到hdfs:
export table default.student to '/student';
export
导出来的文件:
_metadata
文件:存放表的元数据data
文件夹:存放表的数据文件
export
和import
主要用于两个 Hadoop 平台集群之间的 Hive 表迁移。
使用命令从hdfs中导出数据:从hdfs中拉取数据到输入命令的Linux这台主机上:
# 打开Linux终端,在任何地方输入:
[hao@hadoop111 ~]$ hadoop dfs -get hdfs文件1路径 hdfs文件2路径 本地路径
使用web图形化界面从hdfs中导出数据:从hdfs中拉取数据到打开web图形化界面的主机(一般是window)
注意:从hdfs中导出数据,只是导出真实数据,并没有导出元数据
Sqoop
是一个工具,这个后期有专门的blog学习该工具怎么使用,这里不再赘述
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。