Hive 是建立在 Hadoop 上的数据仓库基础构架
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL)
这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制
Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据
同时,也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer
处理内建的 mapper 和 reducer 无法完成的复杂的分析工作
简单理解就是人们嫌 MapReduce 写太麻烦,拿东西封装了一下,将书写格式改为 SQL 风格
前提 hadoop 启动!前提 hadoop 启动!前提 hadoop 启动!
1 传包解压
tar -zxvf /usr/local/module/apache-hive-1.2.1-bin.tar.gz -C /usr/local/soft/
2 名字太长了,裁一下
cd /usr/local/soft/
mv apache-hive-1.2.1-bin/ hive-1.2.1
3 启动配置文件
cd /usr/local/soft/hive-1.2.1/conf
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
4 修改配置文件
vim hive-env.sh
//添加三行,根据实际情况
HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
JAVA_HOME=/usr/local/soft/jdk1.8.0_171
HIVE_HOME=/usr/local/soft/hive-1.2.1
5 修改对应的配置参数 hive-site.xml
需要找到对应的内容挨个修改
能直接换就直接替换文件,或者移到 txt 里慢慢查
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?characterEncoding=
UTF-8&createDatabaseIfNotExist=true&useSSL=false</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>123456</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>
6 复制mysql连接工具包到hive/lib
cd /usr/local/soft/hive-1.2.1
cp /usr/local/module/mysql-connector-java-5.1.49.jar /usr/local/soft/hive-1.2.1/lib/
7 删除hadoop中自带的 jline-2.12.jar
rm -rf /usr/local/soft/hadoop-2.7.6/share/hadoop/yarn/lib/jline-2.12.jar
8 把hive自带的jline-2.12.jar复制到hadoop中
cp /usr/local/soft/hive-1.2.1/lib/jline-2.12.jar /usr/local/soft/hadoop-2.7.6/share/hadoop/yarn/lib/
9 修改 profile 文件
vim /etc/profile
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
10 启动 hive
hive
11 关闭 hive
exit;
操作上和 sql 几乎完全相同
1 在 hive 中创建 fghdata 数据库
create database fghdata;
2 切换 fghdata 数据库
use fghdata;
3 建俩表,student 和 score
详细的丢后面说
create table students(
id bigint,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table score(
id bigint,
score_id bigint,
score int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
4 查看表信息
desc students;
desc score;
5 从 linux 中上传数据到 hdfs
详细的也丢后面
hadoop dfs -put linux路径 hdfs路径
6 查表(和 sql 几乎一致)
select * from students
inner join score
on students.id=score.id;
查询语言:
类 SQL 的查询语言 HQL
熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发
数据存储位置:
所有 Hive 的数据都是存储在 HDFS 中;
数据库则可以将数据保存在块设备或者本地文件系统中
数据格式:
Hive 中没有定义专门的数据格式,数据直接读写,不需要要考虑格式;
数据库中,所有数据都会按照一定的组织存储,加载数据的过程会比较耗时
数据更新:
Hive 对数据的改写比较弱化(修改元数据),0.14版本之后支持,需要启动配置项;
而数据库中的数据通常是需要经常进行修改的
索引:
Hive 在加载数据的过程中不会对数据进行任何处理
因此访问延迟较高,决定了 Hive 不适合在线数据查询;
数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高
执行计算:
Hive 中执行是通过 MapReduce 来实现的;
而数据库通常有自己的执行引擎(SQL 的 executor)
数据规模:
Hive 建立在集群上,可以利用 MapReduce 进行并行计算,支持大规模数据的处理;
数据库可以支持的数据规模较小
即正常的文本格式,是 hive 默认存储格式
默认是一行一条记录,通过指定的分隔符进行分割
内容是无压缩的,在 HDFS 上是明文,可以直接读取,查看
也因此会占用巨大空间
一种列文件格式,行列存储相结合的存储方式
先将数据按行分块,保证一行的数据都在一个 block 之内,再在 block 中,按列存储数据
按列存储保证数据可以压缩,能够只占用很少空间,代价是读写要额外占用一部分 CPU 资源
是对 RCFile 的优化(Optimized :优化)
依然是行列存储相结合的存储方式,拥有更高的压缩比,占用更小的空间
在 MapReduce 中也会使用更少的 task 资源
缺点是写文件会慢一点
一种存储结构化数据的存储格式,如:List、Map、自定义 class 等
可以避免拿到数据之后,再一层层解析数据
存储二进制形式的
最重要的优点就是Hadoop原生支持较好,有API
create [external] table 表;名
(
字段名1 字段类型1,
字段名2 字段类型2,
...
)
//这一句必须写,必须指定列之间的分隔符
ROW FORMAT DELIMITED FIELDS TERMINATED BY '分隔符'
STORED AS file_format
location '/user/hive/warehouse/库名/表名';
sql 会一行行读取数据,界定一行数据中,不同的字段,需要使用分隔符,必须设置
ROW FORMAT DELIMITED FIELDS TERMINATED BY '分隔符'
假设有以下数据,每一个字段由 “,” 分开
1001,fgh,23,男,一班
建表时设置分隔符为 “,” 后,hive 读取时,便会自动对应到不同的字段中
倘若不匹配,hive 会将整行数据识别至第一个字段,其余字段空数据用 null 补齐
显示为
1001,fgh,23,男,一班 null null
声明该表的数据,存储的格式,hive 会自动切换读取方式,可选
STORED AS file_format
不写(使用默认),或 file_format(样例) 均表示 TextFile 存储格式
hive 初始支持三种存储格式 TextFile 、RCFile 、SequenceFile
hive 会将表的名字、列、分区、属性(是否为外部表)、数据源等信息保存于元数据
而表的数据源储存于 HDFS 里,可以自定义路径,也可使用默认,因此可选
location '/user/hive/warehouse/库名/表名'
不写会使用默认路径,即 /user/hive/warehouse/库名/表名
hive 会将目录下的所有文件作为数据源进行读取,因此选择上要注意区分
hive 会将数据源的路径与表绑定,用来从中读取数据
内部表 be like
create table 表名
外部表 be liek
create external table 表名
当删除表后,倘若是内部表,会连带删除路径及里面的文件
倘若是外部表,仅仅会删除表的信息,一般日常使用会选择外部表
方式一:
在虚拟机中使用 hadoop 指令,如果已经打开 hive ,需要退出,或者复制一部
hadoop dfs -put linux路径 hdfs路径
hadoop dfs -put /usr/local/data/students.txt
/user/hive/warehouse/fghdata.db/students;
方式二:
在 hive 中上传,比在 hadoop 中操作 HDFS 要快
dfs -put linux路径 hdfs路径
dfs -put /usr/local/data/students.txt
/user/hive/warehouse/fghdata.db/students;
方式三:
在 hive 中加载(load)HDFS 中文件
实际上是剪切文件,原位置文件将不存在
load data inpath '/HDFS路径' into table 表名(自动找到hdfs的路径)
方式四
在 hive 中加载(load)linux 中文件
实际上是先复制,再剪切,linux 中文件依然存在
load data local inpath '/linux路径' into table 表名(自动找到hdfs的路径)
方式五
在建表时从其他表中注入(insert)数据
缺点是只能使用默认建表格式,默认使用内部表什么的
create table 新表名 as select * from 旧表名
方式六
在 hive 中从其他表中注入数据
insert overwrite/into table 新表名 select * from 就表名
into 是向后添加,overwrite 是清空重写
这种注入会配合新表,更改注入数据的格式
1、清空数据库
truncate table 表名
可以清空内部表的,不能清空外部表
2、hive 可以理解为把大部分 SQL 语句转换为 MapReduce 来执行
不需要转换的例如显示全部,因为 cat 这样的指令就可以实现
3、ctrl + l :清屏
4、在 Group by 子句中,Select 查询的列,
要么需要是 Group by 中的列,
要么得是用聚合函数(比如 sum、count 等)加工过的列,
不支持直接引用非 Group by 的列,这一点和 MySQL 有所区别