本章内容
- Hive 的架构
- Hive 的安装
- Hive 的 DDL
- Hive 的 DML
Hive简介
Hive 可以将存储在 HDFS 中的结构化数据映射为数据库中的一张表,并提供了一种 SQL 方言对其进行查询。
- 这些SQL语句最终会翻译成MapReduce程序执行。
- 它本身并不会存储和计算数据,完全依赖于HDFS和MapReduce。
- Hive 简化了 MapReduce 的编写。
hive的构架
Hive 的安装
安装 Hive 的主要步骤:
- 安装 Hadoop版本:2.7.7
- 安装 MySQL(MetaStore)版本:5.7
- 安装 Hive版本:2.3.7
- 安装 DBeaver(客户端)版本:7.1.0
检查 Hadoop 环境
1、查看 Hadoop 版本号
2、启动 Hadoop,检查进程是否正确
安装 MySQL
- 安装MySQL,使用以下命令:sudo apt-get install mysql-server
- 查看默认的账号和密码,使用以下命令:sudo cat /etc/mysql/debian.cnf
安装 MySQL
- 使用管理员登录 MySQL,使用以下命令:mysql -u debian-sys-maint –p
- 创建 hive 用户,并设置密码,使用以下命令:CREATE USER 'hive'@'%' IDENTIFIED BY '123456';
- 授予 hive 用户权限,使用以下命令:GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%’;
- FLUSH PRIVILEGES;
- 退出 MySQL,使用以下命令:exit
安装 Hive
- 上传 Hive 到 /home/Hadoop
- 解压 Hive 到 /usr/local 目录中,使用以下命令:sudo tar -xvf apache-hive-2.3.7-bin.tar.gz -C /usr/local
- 进入/usr/local目录,使用以下命令:cd /usr/local
- 将解压后的目录重命名为 hive,使用以下命令:sudo mv apache-hive-2.3.7-bin hive
- 修改 hive 目录的拥有者为 hadoop,使用以下命令:sudo chown -R hadoop hive
配置 Hive
- 进入 hive 配置文件目录,使用以下命令:cd /usr/local/hive/conf/
- 创建 hive-site.xml 文件,使用以下命令:vim hive-site.xml
<configuration>
<property>
<name>system:java.io.tmpdir</name> <value>/usr/local/hive/tmp</value>
</property>
<property>
<name>system:user.name</name> <value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
</configuration>
进入 hive 的依赖库目录,使用以下命令:cd /usr/local/hive/lib
上传mysql的驱动文件到lib目录 驱动文件是:mysql-connector-java-5.1.47.jar
配置 Hive
- 进入hadoop软件的配置文件目录,使用以下命令:cd /usr/local/hadoop/etc/hadoop/
- 编辑core-site.xml文件,增加以下内容
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
配置 Hive
- 进入hadoop用户的家目录,使用以下命令:cd ~
- 编辑环境变量文件,使用以下命令:vim .bashrc
- 在环境变量文件最后添加以下内容:
export HIVE_HOME=/usr/local/hive
export PATH=${HIVE_HOME}/bin:$PATH
刷新环境变量,使用以下命令:source .bashrc
初始化Hive,使用以下命令:schematool -dbType mysql -initSchema
环境变量配置成功
验证 Hive
- 查询 Hive 中的默认数据库列表,使用以下命令:hive -e 'show databases'
安装 DBreaver
- 启动Hive服务器,使用以下命令:hiveserver2
- 安装并启动DBeaver
- 解压下载的DBeaver压缩包
- 双击DBeaver.exe启动程序
安装 DBreaver
- 新建Hive链接配置
- 点击工具栏的数据库
- 选择新建链接
- 在链接中搜索hive
- 选择hive链接类型:
安装 DBreaver
- 配置Hive链接信息
- 主机填写Linux服务器的ip
- 填写Linux的帐号和密码
- 安装Hive驱动
- 点击编辑驱动设置
- 下载/更新驱动
- 链接Hive驱动
- 配置完成后毕后一次点击确定和完成
- 自动链接Hive
Hive中的数据库
- 常用语句:
- 如果数据库不存在则创建:CREATE DATABASE IF NOT EXISTS school;
- 列出所有数据库:SHOW DATABASES;
- 切换数据库:USE school;
- 删除数据库:DROP DATABASE IF EXISTS school CASCADE;
- 默认只能删除空的数据库,即不包含表的数据库;
CASCADE关键字可以先删除数据库中的表,在删除数据库
- Hive中的数据库本质上HDFS上的一个目录
- 默认位于/usr/hive/warehouse目录下
- 由属性hive.metastore.warehouse.dir决定
数据库的文件目录名称是以.db结尾
Hive中的表
数据类型:本质还是Java中的数据类型的
分隔符:通过分隔符来识别行、列和集合中的元素
默认的分隔符都是一些不常用的字符
- 自定义行分隔符 LINES TERMINATED BY '\n'
- 自定义列分隔符 全部放到以下子句后边 ROW FORMAT DELIMITED
- 自定义列分隔符 FIELDS TERMINATED BY ' ‘
- 自定义集合分隔符 COLLECTION TERMINATED BY ' '
- 自定义Map分隔符 MAP TERMINATED BY ' '
Hive中的表
- 导入HDFS数据到表,本质是一个剪切操作 剪切数据文件到表目录中
- 导入本地数据到表,本质是一个上传操作 上传数据文件到表目录中
- 表结构存在MySQL的Hive数据库中 TBLS、COLUMNS_V2等
- 表数据存储在表目录中
- 这种表叫做内部表(管理表),管理着数据的生命周期
- 删除表的时候会删除表结构和、表目录和其中的数据文件
外部表
- 和其他程序共享数据,不管理数据的生命周期
- 不会在数据库目录下创建表目录,也不会剪切数据文件
- 也不会在删除表的时候删除数据文件
- 使用EXTERNAL关键字表明这是个外部表
- 使用LOCATION关键字指明数据在HDFS上的存储位置
分区表
- 把表中的多个数据文件,按照分区字段的值进行管理
- 一个分区字段的值就对应表目录下的一个目录
- 分区字段也是表中的列,叫做虚拟列(虚拟字段)
- 分区字段的值不在数据文件中,导入数据时手动设置
- 使用 PARTITIONED BY 字段设置分区字段
Hive中的查询
- 查询语法 SELECT…FROM…WHERE…
- 排序:
- ASC 升序(默认),DESC 降序
- ORDER BY:全局排序,速度慢
- SORT BY:对每个 reduce 中的数据进行排序,全局无序
- DISTRIBUTE BY:按照列值进行分区 CLUSE BY
- 如果 SORT BY 和 DISTRIBUTE BY 使用的是相同列可以合并为 CLUSE BY
连接查询
- 左连接——返回左表全部数据,右表匹配不上返回 null ----SELECT a.id , a.name , b.course_name FROM teacher a LEFT JOIN score b ON a.id = b.teacher_id;
- 右连接——返回右表全部数据,左表匹配不上返回 null----SELECT b.id , b.name , a.course_name FROM score a RIGHT JOIN teacher b ON a. teacher_id = b.id;
- 内连接——只返回匹配上的数据----SELECT a.id, a.name, b.course_name, b.score FROM student a INNER JOIN score b ON a.id = b.student_id;
今天的学习分享已完成 耶!!!