HIve 的基本使用
1.概述
Hive 是建立在Hadoop上的数据仓库基础构架。用于进行数据的ETL(Extract、Translation、Load)提取、转化、加载。不提供OLTP(在线事务处理),多使用在大数据集的批处理作业。
2.架构
特性:
① Hive存储文件的系统使用的HDFS。
② Hive计算模型使用的是 MapReduce。
③ 实时性很差。
④ 容易扩展自己的存储能力和计算能力。
3.安装使用
3.1 前置条件:
·1. 可用的MySQL服务
MySQL数据库的编码必须是Latin1编码
·2. 正常运行的HDFS、YARN
必须配置HADOOP_HOME环境变量,这样Hive可以通过HADOOP_HOME环境变量感知用户的Hadoop计算集群的位置和规模。
3.2 安装步骤
① 解压安装包
② hive-site.xml
进入conf/文件夹,创建hive-site.xml文件。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://你的主机名:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
③ 将MySQL的驱动jar拷贝到lib目录下
cp ~/mysql-connector-java-5.1.10-bin.jar lib/
- 注意 : 尽量不要使用 mysql-connector-java-5.1.18.jar 会出现各种错误。
④ 配置HIVE_HOME环境变量
4.启动
单用户模式
hive
多用户模式
- 后台启动服务
hiveserver2 >/dev/null 2>&1 &
- 进入控制台
beeline -u jdbc:hive2://你的主机名:10000 -n root
5.DDL
5.1 数据类型
Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:
原始类型
类型 | 描述 | 字面量示例 |
---|---|---|
BOOLEAN | 布尔值,可选值true/false | true |
TINYINT | 1字节的有符号整数 -128~127 | 1Y |
SMALLINT | 2个字节的有符号整数,-32768~32767 | 1S |
INT | 4个字节的带符号整数 | 1 |
BIGINT | 8字节带符号整数 | 1L |
FLOAT | 4字节单精度浮点数1.0 | |
DOUBLE | 8字节双精度浮点数 | 1.0 |
DEICIMAL | 任意精度的带符号小数 | 1.0 |
STRING | 字符串,变长 | “Abc” |
VARCHAR | 变长字符串 | “Aac” |
CHAR | 固定长度字符串 | “a”,’b’ |
BINARY | 字节数组 | |
TIMESTAMP | 时间戳,纳秒精度 | 122327493795 |
DATE | 日期 | ‘2020-01-01 |
复杂类型
类型 | 描述 | 字面量示例 |
---|---|---|
ARRAY | 有序的的同类型的集合 | array(1,2) |
MAP | key-value,key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) |
STRUCT | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
5.2 库操作
- ① 查看所有库
show databases;
- ② 创建库
create database 库名;
指定位置的创建库(schema 等价 database)
关键字: location
create schema if not exists 库名 location 'hdfs:///指定的位置';
- ③ 使用库
use 库名;
- ④ 查看当前库
select current_database();
查看当前库详细信息
desc database 库名;
- ⑤ 删除库
默认直接删除 关键字:restrict
drop database 库名 ;
级联删除 关键字:cascade
drop database 表名 cascade;
5.3 表操作
默认分隔符
在创建完表之后,需要准备数据,其中hive默认的字段分割符号如下,因此上述建表等价写法如下:
分隔符 | 描述 |
---|---|
\n | 对于文本文件而言,一行表示一条文本记录,因此可以使用\n表示 |
^A(Ctrl+A) | 用于分割字符的列,在创建表的时候可以使用八进制’\001’表示 |
^B(Ctrl+B) | 用于分割ARRAY、STRUCT或者MAP中的元素,在创建表的时候可以使用八进制’\002’表示 |
^C(Ctrl+C) | 用于分割MAP中的key,value,在创建表的时候可以使用八进制’\003’表示 |
- 数据样本:
①创建表
- 使用不同分隔符:
# 默认分隔符格式(可省略)
create table if not exists 表名 (
id int,
name varchar(32),
age int,
salary double,
birthDay date,
hobbies array<string>,
address struct<street:string,country:string>,
detail map<string,double>
)
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;
# -------------------------------------------------------------------
#自定义分隔符
create table if not exists 表名(
id int,
name string,
sex boolean,
age int,
salary double,
hobbies array<string>,
card map<string,string>,
address struct<country:string,city:string>
)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by '>'
lines terminated by '\n'
stored as textfile;
# 数据样本:
1,zhangsan,true,18,15000,TV|Game,001>建设|002>招商,china|bj
2,lisi,true,28,15000,TV|Game,001>建设|002>招商,china|bj
3,wangwu,false,38,5000,TV|Game,001>建设|002>招商,china|sh
#--------------------------------------------------------------------
#正则格式
create table if not exists 表名(
ip string,
app varchar(32),
service string,
last_time timestamp
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex"="^(.*)\\s(.*)\\s(.*)\\s(.*\\s.*)$"
);
#数据样本:
192.168.0.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.2.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.0.1 xx com.xx.xx.XxxService#xx 2018-10-10 10:10:00
192.168.202.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00
#--------------------------------------------------------------------
#CSV格式(无限制表格)
CREATE TABLE if not exists 表名(
id int,
item string,
count int,
price double
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"escapeChar" = "\\"
);
#数据样本:
1,apple,3,20.5
2,orange,2,21.5
3,pear,2,22.5
4,banana,1,23.0
#--------------------------------------------------------------------
#JSON格式