Hive入门
Hive是FaceBook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张表
,并提供类SQL查询功能。
-
结构化数据是指没有表名和列名的数据文件,映射为一张表就是给这个数据添加表名和列名,让开发人员后续实现需求时只需使用类似SQL的代码来查询数据。
-
Hive本质是一个Hadoop客户端,将HQL转化成MapReduce程序。底层都是hadoop实现的,Hive的主要工作有点类似编译器。
-
Hive架构原理
- 解析:检查语法是否正确,表名列名是否存在
- 编译:将执行SQL代码的步骤列处理,生成逻辑计划
- 优化:将执行步骤优化,降低去除冗余操作,生成物理计划
- 执行:执行物理计划,即底层的MR操作
-
特点:执行延迟比较高,只支持追加写,不能实现update和delete.
-
Hive和数据库的比较:
- Hive达到PB级别,mysql单表一般百万左右
- Hive计算引擎是MapReduce/spark, MySQL引擎是InnoDB
- Hive执行延迟高,MySQL执行延迟低
-
官网地址:hive.apache.org
安装Hive
- 修改core-site.xml,允许其他主机登录连接
- 打开端口号为10000的连接服务hive servervice2
- vim conf/hive-site.xml
- hive --service hiveservice2
- 当前窗口会停止在当前界面
- 从datagrip中连接,由于自己是在window环境中,使用atguigu登录,这个身份是造假的,hadoop无法核实,必须在第一步开放权限才行。
- 也可以使用hive/bin目录下的beeline命令来连接hive。进入后可以使用
!quit
退出。
metastore独立服务模式
各个主机不直接连接MySQL数据,先连接metastore数据库,在metastore服务来设置账号密码,增加安全性,降低MySQL服务器的压力。
- hive-site.xml文件中添加指定metastore服务的地址
- 启动该独立服务hive --servie metastore
- 再启动hive --service hiveservice2
目前来说,这些服务进程都是前台进程,不是很安全,希望变成后台进程,自己运行。
编写hive启动脚本
脚本命令解析:
nohup
: 将前台进程输出的内容输入当当前路径的nohup.out文件中,关闭终端进程也继续保持运行状态nohup hive --service hiveserver2 &
: 打印pid, 并且变成后台进程- 符号含义
>
覆盖写>>
追加写>&
合并
- linux系统的三种流
- 标准输入流: 键盘输入 代表数字为0
- 标准正确输出流: 控制台输出 代表数字为1
- 标准错误输出流:控制台输出 代表数字为2
2>&1
:将报错的日志和正常的日志合并到一起/dev/null
黑洞,执行代码但是不打印输出结果grep -v
参数 :过滤掉结果中带有参数的。grep -i 参数,过滤时忽略大小写- awk 按照空格切割时会忽略无效值,
awk -F
按照自定义的进行分割 - z
参数 : 判断参数是否存在
Hive的两个常用调用
- hive -e 命令行输入SQL命令
- hive -f 文件输入SQL命令
Hive日志参数配置方式
- 查看:进入hive后,使用
set;
命令查看 - 修改:
- 修改hive-site.xml文件
- 命令行:
hive --hiveconf 参数值 = 修改值;
修改的值是临时且独立的 - 进入hive:
set mapreduce.job.reduces=10;
set 参数名;
:查看参数
其他参数配置
- 显示表名和库名: header
- 修改日志存放路径:vim hive/conf/hive-log4j2.properties
- 修改hive申请的内存大小
vim hive-env.sh.
打开HADOOP_HEAPSIZE=2048
使用Hive的map和struct结构
sql
create table tch(
name string, --姓名
friends array<string>, --朋友
students map<string, int>, --学生
address struct<street:string,city:string,email:int> --地址
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
MySQL和Hive类型转换的区别
- 转换方向:
- mysql:字符串向int进行转换
- hive:字符串向double进行转换
- 转换失败时:
- mysql: 结果变成0
- hive:结果变成null
Hive语法
DDL数据定义语言
数据库操作
-
数据库增加操作
- create database [if not exists] database_name: 创建库
- 默认路径在/user/hive/warehouse
- 库文件夹有.db后缀
- create database [if not exists] database_name: 创建库
-
数据库查询操作
- show databases; 打印所有的库
- show databases like 'db_hive*'
- desc database extended database_name: 查看库的信息和注释
-
数据库删除操作
- drop database database_name; 删除空库
- drop database database_name cascade; 删除非空库
-
数据库修改操作
- alter database databasename set dbproperties('xx' = 'bbb');
- 其他属性无法修改,可以在MySQL中进行修改,但是不建议修改
表的操作
内部表(管理表)
- 表的创建
create table table_name(属性名, 属性类型...)
- external 在table字段添加,表示为外部表
- partitioned by 分区表
- clustered by 分桶表
- sorted by into n buckets: 桶内排序字段和分成几个桶
- row format row_format 行分隔符默认值
FIELDS TERMINATED BY char
字段分割符号 ^A ctrl+v ctrl+a- 集合元素分隔符 ^B ctrl+v ctrl+b
- map元素分割符 ^C ctrl+v ctrl+c
- 行分割符 '\n'
- 表对应的文件存储格式 textfile
LOCATION 表对应的hdfs路径
TBLPROPERTIES(property_name=property_value,..)
表的属性
- 根据查询结果创建一张表,不带原表的分隔符
create table if not exists student2 as select id, name from student;
- 根据表结构创建表,带表的分隔符
create table if not exists student3 like student;
外部表
外部表删除时只会删除hive中的元数据,不会删除HDFS中的文件。而内部表删除时会将元数据和HDFS中的文件信息一并删除。在公司中大部分都是外部表,内部表一般用于测试和中间表。
如何区分内部表和外部表?
desc formatted table_name
查看表的类型区分内外部表
是否可以将内部表转换为外部表?
alter table tablename set tblproterties('EXTERNAL' = 'TRUE');
外部表
alter table tablename set tblproterties('EXTERNAL' = 'FALSE');
内部表
-
表的查询操作
show tables; 查询所有表
desc table; 查询表的粗略信息
desc formatted table; 查询表的详细信息 -
表的删除操作
drop table table_name;
truncate table table_name;清空表中数据,不能清空外部表 -
表的修改操作
- 修改表名:
alter table old_name rename to new_name;
- 修改列名:
alter table_name change id ids int;
- 增加列:alter table table_name add columns(...);
- 替换列:alter table table_name replace columns(...);
- 修改表名:
DML数据操作语言
数据导入
- 向表中装载数据Load
load data [local] inpath '数据的path' [overwrite] into table table_name [partition (partcol1=val1,...)];
- 根据查询结果插入数据,插入的数据列数必须和被插入表一样。
- insert into table student (查询语句) :追加写
- insert overwrite student (查询语句):覆盖写
数据导出insert
- 导出到本地:insert overwrite local director '本地路径' (查询语句),分隔符是默认的,可以进行指定分隔符
- 导出到HDFS系统中,insert overwrite director '本地路径' (查询语句)