我与Hive的不解之谜系列(二):Hive的常见命令及导入数据和导出数据
本篇主讲内容
1.温故知新
2.hive的常见命令
3.内部表和外部表
4.导入数据的方式
5.导出数据的方式
温故知新
1)在hive中使用hdfs的命令 dfs +命令 如:dfs -ls /
2)hive只能分析结构化的数据
3)hive的本质:
在hive中创建的表,库都在hdfs上有相应的路径!
表中的数据,是文件的形式在表对应的目录中存放!
在建表和建库后,会在Mysql中生成对应的schema信息!
tbls: 存放表的元数据
dbs: 库的元数据
column_v2: 列的元数据
hive的常见命令
库操作
增
create database if not exists 库名
comment 库的注释
location 库的路径
with dbproperties(属性名=属性值,...)
删
drop database 库名 需要这个数据库下面没有表
drop database 库名 cascade: 强制删除(不管有没有表)
改
alter database 库名 set dbproperties(''='',''='')
查
show databases; 查看所有的数据库
desc database 库名 查看这个库的信息
desc database extended 库名 查看这个数据库更为详尽的信息
表操作
创建
create [external] table if not exists 表名
(列名 列类型 comment 列注释,...)
comment 表的注释
.....
row format ... //表中每行数据的格式
store as xxxx //表中数据的存储格式
location //表的路径创建表,带external,这个表是外部表,不带是管理表(内部表)
外部表在删除表时,只删除mysql中的元数据!
管理表在删除表时,删除mysql中的元数据和在hdfs表目录中的数据
表是廉价的,数据是珍贵的,一般都建议外部表!
外部表: alter table 表名 set tblproperties('EXTERNAL'='TRUE')
内部表: alter table 表名 set tblproperties('EXTERNAL'='FALSE')
查看表信息
desc tb_name ; --字段信息
desc formatted tb_name ; --表的详细信息
- 表字段
- 位置
- 类型 (内部表 外部表)
- 输入数据类型
- 分隔符
内部表和外部表
在hive中的表分两种
1)外部表 external
2)内部表 默认的 也称管理表 managertable
区别详解
先创建一个表
create table tb_log(
id int,
name string,
age int,
gender string
)
row format delimited fields terminated by ‘,’
location ‘hdfs://linux01:8020/data/log/’
创建一个表(管理表)
create table tb_log2(
id int ,
name string )
row format delimited fields terminated by “,”
location ‘hdfs://linux01:8020/data/log/’ ;
删除此表
drop table tb_log2 ; – 指定的路径下的数据会被删除
select * from tb_log ; --没有数据
创建一个外部表—external关键字
create external table tb_log2(
id int ,
name string )
row format delimited fields terminated by “,”
location ‘/data/log/’ ;
此时删除此表
drop table tb_log2 ; – 指定的路径下的数据不会被删除
select * from tb_log ; --有数据没有受别的表影响
什么时候用
使用外部表更加的安全,重要原始核心数据或者建表都用外部表,使得删除的时候不会真正删掉hdfs上的文件
内部表一旦删除,就没有了。
导入数据的方式
hive是使用SQL语句处理HDFS上的结构化数据
直接put 将结构化数据放进表的目录中
1)建表的时候指定location 结构化数据的位置文件夹
create table tb_log( id int, name string, age int, gender string ) row format delimited fields terminated by ‘,’ location ‘hdfs://linux01:8020/data/log/’
2)将结构化数据直接put到表的目录中
hdfs dfs -put a.txt /data/log/
load方式导入数据
load本地数据到表中
1)在linux01中准备结构化数据
2)创建表 tb_user 并指定切割结构化数据的分隔符
create table tb_user( uid string, name string, age int, gender string ) row format delimited fields terminated by ',';
load数据到表中
load data local inpath '/root/data.txt' into table tb_user
查询表发现有数据:
load hdfs上的结构化数据到hive中
去掉local 使用hdfs的目录 为什么他会自己能找到hdfs的目录呢?我们之前在机器上配过的:默认文件系统为HDFS
load data inpath "/root/data.txt" into table tb_user ;
前两个load都是导入数据到表中,会在表中追加数据,你比如再执行一次load本地文件到tb_user中,你会发现内容被追加了
还有一个load是往表中覆盖数据 overrite
load data local inpath "/root/data.txt" overwrite into table tb_user ;
insert插入数据:不建议使用
insert into tb_user values(1,‘fjj’),(2,‘bgg’) ; – 生成小文件
insert into tb_user values(1,‘fjj’),(2,‘bgg’) ; – 生成小文件insert 保留结果数据到表中
insert into tb_user select id , name from tb_log ; +--------------+---------------+ | tb_user.uid | tb_user.name | +--------------+---------------+ | 1 | zbz | | 2 | ycy | | 3 | gdg | | 4 | lyf | +--------------+---------------+ 注意 表的结构和查询的结果字段 个数 数据类型 属性一致
insert 保留结果数据到新的表中 全量数据
create table tb_log_res as select id , name from tb_log ; +----------------+------------------+ | tb_log_res.id | tb_log_res.name | +----------------+------------------+ | 1 | zbz | | 2 | ycy | | 3 | gdg | | 4 | lyf | +----------------+------------------+
import
需要和export一起用
export table tb_log to '/user/hive/warehouse/export/tb_log';
import table tb_log2 from '/user/hive/warehouse/export/tb_log';
更多学习、面试资料尽在微信公众号:Hadoop大数据开发