一.hive内外表操作
1. 建表语法
create [external] table [if not exists] 表名(字段名 字段类型 ,字段名 字段类型,...)
[partitioned by (分区字段名 分区字段类型)] # 分区表固定格式
[clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式
[sorted by (排序字段名 asc|desc)]
[row format delimited fields terminated by '字段分隔符' ] # 自定义字段分隔固定格式
[stored as textfile] # 默认即可
[location 'hdfs://域名:8020/user/hive/warehouse/库名.db/表名'] # 默认即可
; # 注意: 最后一定加分号结尾
2. 数据类型
基本数据类型:
整数 int
小数 float double
字符串 string varchar
时间 date timestamp
3. 表分类
Hive中可以创建的表有好几种类型,分别是:
内部表(管理表或者托管表)
外部表(非管理表或者非托管表)
二.内部表基本操作
1. 知识点
创建内部表:create table [if not exists] 内部表名(字段名 字段类型,字段名 字段类型...)
[row format delimited fields terminated by '字段分隔符'];
复制内部表:方式1:like方式复制表结构 方式2:as方式复制表结构和数据
删除内部表:drop table 内部表名;
注意:删除内部表效果是mysql中表的相关元数据被删除,同时存储在hdfs中业务数据本身也被删除
查看表格式话信息:desc formatted 表名;
-- 内部表类型:MANAGED_TABLE
注意:还可以使用truncate清空内部表数据 格式:truncate table 内部表名
三. 外部表基本操作[练习]
1. 知识点
创建外部表:create external table [if not exists] 外部表名(字段名 字段类型,字段名 字段类型,...)[row format delimited fields terminated by '字段分隔符'];
复制表:方式1:like方式复制表结构
注意:as 方式不可以使用
删除外部表:drop table 外部表名
注意:删除外部表效果是mysql中元数据被删除,但是存储在hdfs的业务数据本身被保存
查看表格式化信息:desc formatted 表名;
-- 外部表类型:EXTERNAL_TABLE
注意:外部表不能使用truncate清空数据本身
四 .查看/修改表
1. 知识点
查看所有表:show tables;
查看建表语句:show create table 表名;
查看表信息:desc 表名;
查看表结构信息:desc 表名;
查看表格式化信息:desc formatted 表名; 注意:formatted能够展示详细信息
修改表名:alter table 旧表名rename to 新表名
字段添加:alter table 表名 add columns (字段名 字段类型);
字段的替换:alter table 表名 replace columns (字段名 字段类型,...)
字段名和字段类型同时修改:alter table 表名 change 旧字段名 新字段名 新字段类型;
注意:字符串类型不能直接改数值类型
修改表路径:alter table 表名 set location ‘hdfs中存储路径’;
修改表属性:alter table 表名 set tblproperties('属性名'=‘属性值’)
五.默认分隔符
1.知识点:
创建表的时候,如果不指定分隔符,以后表只能识别默认的分隔符
一般为:\0001,SOH,^A,□
六.快速映射表
1. 知识点:
创建表的时候指定分隔符:create [external] table 表名(字段名 字段类型) row format delimited fields terminated by 符号;
加载数据:load data [local] inpath '结构话数据文件' into table 表名;
七.数据导入和导出
文件数据加载导入
1.直接上传文件
window页面上传
linux本地put上传
hdfs dfs -put 文件 路径
2.load加载文件:
从hdfs路径把文件移动到表对应存储路径中:
load data inpath 'HDFS文件路径' [overwrite] into table 表名;
从linux本地把文件上传到表对应存储路径中:
load data local inpath 'Linux文件路径' [overwrite] into table 表名;
3.insert插入数据
从其他表查询数据'追加'插入到当前表中:insert into [table] 表名 select 语句;
从其他表查询数据'覆盖'插入到当前表中:insert overwrite table 表名 select 语句;
文件数据导出
1.直接下载文件
web页面下载
get命令下载文件
需求: 已知search_log.txt文件在HFDS的/user/hive/warehouse/hive02.db/search_log路径下,要下载到linux系统
[root@node1 binzi]# hdfs dfs -get /user/hive/warehouse/hive02.db/search_log/search_log.txt /binzi
2. insert导出数据
查询数据导出到hdfs其他路径:insert overwrite directory 'hdfs存储该数据路径' select语句;
查询数据导出到linux本地中:insert overwrite local directory 'linux存储该数据路径' select语句;
注意: overwrite默认是覆盖重写,所以在指定存储该数据路径的时候尽量指定一个空的目录
注意: 导出数据的时候不指定分隔符采用默认分隔符SOH,0001,?...
导出数据指定分隔符添加:row format delimite fields terminated by ‘分隔符’
3.hive_shell命令
hive命令执行sql语句: hive -e "sql语句" > 存储该结果数据的文件路径
hive命令执行sql脚本: hive -f sql脚本文件 > 存储该结果数据的文件路径
hql语句导出
# 以下命令都是在linux的shell命令行执行
# 3.1使用hive -e sql语句方式导出数据
[root@node1 ~]# hive -e 'select * from hive02.search_log;' > /home/hs1.txt
[root@node1 ~]# cat hs1.txt
hql语句
# 3.2使用hive -f 脚本文件方式导出数据
[root@node1 ~]# echo 'select * from hive02.search_log;' > /home/export.sql
[root@node1 ~]# hive -f export.sql > /home/hs2.txt
[root@node1 ~]# cat hs2.txt