开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
前言
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。
以上是百度上对hive的介绍。
简单来说,hive并不是一个数据库它是数据仓库,它的底部存储的是文件,通过文件来映射成一张表它将用户编写的SQL语句转换成MR程序运行,实时性低延迟高,不适合做实时查询。 由于Hive在查询数据的时候无索引,需要扫描整个表, 而且MR框架也是比较复杂的,所以延迟会比较高。这也意味着,hive在对实时性要求不高,适合做大量数据的报表数据。
安装hive
步骤:
-
解压hive包到/usr/local/src目录。重命名
-
配置hive环境变量
-
进入到hive下的conf目录下复制
hive-env.sh.template模板,输入:cp hive-env.sh.template hive-env.sh -
vi编辑器打开hive-env.sh,
vi hive-env.sh,在该文件中追加以下路径,完成后保存返回。
export JAVA_HOME=/usr/local/src/jdk
export HADOOP_HOME=/usr/local/src/hadoop
export HIVE_HOME=/usr/local/src/hive
export HIVE_CONF_DIR=/opt/soft/hive/conf
export SPARK_HOME=/opt/soft/spark
- 复制
hive-default.xml.template模板,输入:cp hive-default.xml.template hive-site.xm,并使用vi编辑器打开该文件,修改以下配置:
4个核心配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true&characterEncoding=UTF-8</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>
3个路径配置(非必须,有时报错才加入)
<property>
<name>hive.querylog.location</name>
<value>/opt/soft/hive/tmp</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/soft/hive/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/opt/soft/hive/tmp</value>
</property>
-
将java连接mysql的驱动包放入hive的lib下
cp mysql-connector-java-5.1.39.jar /usr/local/src/lib/ -
初始化hive元数据:
schematool -dbType mysql -initSchema -
直接输入hive可以进入Hive的命令行(先启动hadoop,否则无法启动hive)
基本使用
常用指令
| 命令 | 作用 |
|---|---|
| show databases; | 查看所有数据库 |
| create database 数据库名; | 创建数据库 |
| use 数据库名; | 使用指定数据库 |
| drop database 数据库名; | 删除数据库 |
| show tables; | 查看某个数据库下的所有表 |
创建表
我们除了要写明字段名和字段类型,还要写表的分隔字段以及保存格式
1)语法:
create table 表名(
列名 类型,列名 类型,....
) COMMENT '表的声明'
(partitioned by.....)------分区
(clustered by.....)------分桶
(sorted by.....)------排序
(location path)----------数据的导入位置
row format delimited fields terminated by ',' )----------行格式分隔字段以“,”结尾
lines terminated by '\n')----------以“\n”结尾的行
stored as textfile;)----------文件形式保存
2) 查看hive表结构命令
desc 表名;
表的类型
create table hivetest_1----------默认创建管理表(内部表)
create external table hivetest_2----------创建外部表
管理表:在删除表的时候,会连带着把源数据也给删了:一般用于临时业务,且总表还在
外部表:在删除表的时候,不会删除表所在的源数据
注:创建表的时候如果使用location的方式,一定要注意使用external,建立外部表,否则,当你把 表删了的时候,连带着location的数据也给删了。
数据导入
将数据加载到hive中的表里面(数据文件仍然在hdfs中,hive表中是不会存储数据的,只是和hdfs上的文件建立了某种关联),加载数据可以从hdfs中加载,也可以从本地加载,不管哪一种,内部表都会将该文件放入hdfs中的hive目录中管理。
本地加载: load data local inpath '本地路径'overwrite into table tableName;
hdfs加载: load data inpath 'hdfs文件路径'overwrite into table tableName;
案例
案例1:把stu表数据插入stu2中:
insert overweite table stu2 select * from stu;
案例2:通过sql命令对该文件进行分析汇总统计
select city,count(*) from tb_movie group by city;
案例3:统计各个城市下的票房总额前三名:
select city,sum(sale_money) as zong from tb_movie group by city order by zong desc limit 3;