- 下载上传:官网(http://hive.apache.org/)ALT+P:上传到节点
- 解压:tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /root/hd
- [可选]修改hive文件夹名称 :mv /root/hd/apache-hive-1.2.2-bin/ /root/hd/hive/
- 修改配置文件hive-env.sh
- 更改配置文件名称:mv hd/hive/conf/hive-env.sh.template /root/hd/hive/conf/hive-env.sh
- 配置hadoop路径:
HADOOP_HOME=/root/hd/hadoop-2.8.5 - 配置hive配置文件路径:
export HIVE_CONF_DIR=/root/hd/hive/conf
- 修改配置文件hive-site.xml:vi /root/hd/hive/conf/hive-site.xml
增加如下配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property> - 启动hdfs:start-dfs.sh
- 启动yarn:start-yarn.sh
- hdfs创建目录:hdfs dfs -mkdir /tmp; hdfs dfs -mkdir -p /user/hive/warehouse
- 修改权限:hdfs dfs -chmod 777 /tmp;hdfs dfs -chmod 777 /user/hive/warehouse
- 启动hive:bin/hive
- 测试hive是否安装成功:
- 查看数据库:show databases;
- 使用数据库:use default;
- 查看表:show tables;
- 创建表:create table itstar(id int,name string);
- 原因:Hive默认deploy数据库不支持多客户端操作,严重缺陷,因此安装mysql来替代deploy
- 检查是否有安装mysql:yum list installed | grep mysql
- 如果有则删除:yum -y remove 数据库名称
- 安装依赖:yum search libaio;yum install libaio
- 安装wget(不存在情况):yum install wget
- 下载 MySQL Yum Repository:wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
- 安装 MySQL Yum Repository:rpm -ivh mysql-community-release-el7-5.noarch.rpm 或 yum localinstall mysql-community-release-el7-5.noarch.rpm
- 验证 MySQL Yum Repository是否安装成功:yum repolist enabled | grep "mysql.*-community.*"
- (可选)查看MySql版本:yum repolist all | grep mysql
- (可选)查看当前可用的Mysql版本:yum repolist enabled | grep mysql
- 安装MySql:yum install mysql-community-server
- 安装完成包括,mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs 四个包
- 查看mysql目录:whereis mysql
- 启动mysql:systemctl start mysqld
- 查看状态:systemctl status mysqld
- 查看版本:mysqladmin --version
- mysq修改密码:
- 切换数据库:use mysql
- 修改密码:update user set password=password('新密码') where user='要更新密码的用户名'
- 刷新权限:flush privileges
- 重启服务:service mysqld restart
- (需远程连接情况)远程访问 MySQL, 需开放默认端口号 3306:
- firewall-cmd --permanent --zone=public --add-port=3306/tcp
- firewall-cmd --permanent --zone=public --add-port=3306/tcp
- firewall-cmd --reload
- (需外部连接情况)关闭防火墙
- firewall-cmd --state --查看防火墙状态
- systemctl stop firewalld -- 关闭防火墙
- systemctl disable firewalld -- 禁止启动防火墙
- 配置驱动:
- 下载:wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.39.tar.gz
- 解压:tar -zxvf mysql-connector-java-5.1.39.tar.gz
- 拷贝:cp /root/mysql-connector-java-5.1.39/mysql-connector-java-5.1.39-bin.jar /root/hd/hive/lib/
- 配置配置文件:
- 新建配置文件:touch /root/hd/hive/conf/hive-site.xml
- 修改配置文件:vi /root/hd/hive/conf/hive-site.xml,增加内容并修改,自行修改主机名称、mysql账号密码
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://Hadoop01:3306/metastore?createDatabaseIfNotExist=true</value> <description>设置元数据库存放地址</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>指定JDBC驱动</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>mysql账号</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>mysql密码</description> </property> </configuration>
- 若已经启动hive,需要重启hive,bin/hive
Java数据类型 | Hive数据类型 | 长度 | 类型名称 |
---|---|---|---|
byte | TINYTNT | 1字节 | - |
short | SMALTNT | 2字节 | 小整型 |
int | INT | 4字节 | 整型 |
long | BIGINT | 8字节 | 长整型 |
float | FLOAT | 4字节 | 单精度浮点数 |
double | DOUBLE | 8字节 | 双精度浮点数 |
string | STRING | 2字节 | 字符类型 |
- | TIMESTAMP | 2字节 | 时间类型 |
- | BINARY | - | 字节数组 |
- 创建数据库
- 标准:CREATE DATABASE IF NOT EXISTS table_name;
- 创建到hdfs指定路径:CREATE DATABASE table_name LOCATION 'hdfs_path';
- 修改数据库
- 查询数据库结构:DESC DATABASE table_name;
- 添加描述信息:ALTER DATABASE table_name DBPROPERTIES('描述信息');
- 查看拓展信息:DESC DATABASE EXTENDED table_name;
- 查询数据库:
- 显示数据库:SHOW DATABASE;
- 筛选数据库:SHOW DATABASE LIKE 'db*';
- 删除数据库:DROP DATABASE IF EXISTS table_name;
- 创建表:CREATE TABLE table_name(column_name column_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
- 管理表(内部表):
- 不擅长做数据共享,删除hive中的管理表,数据也同时会删除,hive上面只是表,hdfs上面存储数据
- 有数据计算、数据传输的情况会走MR程序,例如计算有多少行、查询数据放入新表等
- 加载数据:LOAD DATA LOCAL INPATH 'file_path' INTO TABLE table_name;
- 查询的数据插入新表:CREATE TABLE IF NOT EXITS new_table_name AS SELECT * FROM old_table_name WHERE column_name='value';
- 查询表结构:DESC FORMATTED table_name;
- 管理表(外部表):
- Hive不认为这张表拥有这份数据,删除该表,数据不删除,擅长做数据共享
- 创建:CREATE EXTERNAL TABLE IF NOT EXISTS table_name(column_name column_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
- 删除后重新创建管理表 CREATE TABLE IF NOT EXISTS table_name(column_name column_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"; (数据会自动关联)
- 创建分区表:
CREATE TABLE table_name(column_name column_type) PARTITIONED BY (day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
注:按照时间分区 day string
- 导入数据:LOAD DATA LOCAL INPATH 'file_path' INTO TABLE table_name PARTITION(day=day_value);
- 单分区查询:SELECT * FROM table_name WHERE day=day_value;
注:不加条件会查询所有的分区数据
- 添加分区:ALTER TABLE table_name ADD PARTITION(day=day_value);
- 表结构查询:DESC FORMATTED table_name;
- 删除指定分区表:ALTER TABLE table_name DROP PARTITION(day=day_value),PARTITION(day=day_value);
- 修改表名:ALTER TABLE table_name RENAME TO new_table_name;
- 添加列:ALTER TABLE table_name ADD COLUMNS (new_column string);
- 更新列类型:ALTER TABLE table_name CHANGE COLUMN old_column new_column int;
- 替换列:ALTER TABLE table_name REPLACE COLUMNS(column_name_new column_type_new);
注:相当于重定义,原来的数据也会丢失
- 本地加载数据:LOAD DATA LOCAL INPATH 'file_path' INTO TABLE table_name;
- 加载HDFS数据:LOAD DATA INPATH 'hdfs_path' INTO TABLE database_name.table_name;
注:相当于剪切,把数据剪切到hdfs目录去了 - 数据覆盖:LOAD DATA LOCAL INPATH 'file_path' OVERWRITE INTO TABLE table_name;
- 向分区表插入数据:INSERT INTO TABLE table_name PARTITION(month='201811') VALUES (value,value);
- 按条件查询后放入新表:CREATE TABLE IF NOT EXISTS table_name_new AS SELECT * FROM table_name WHERE column_name = value;
- 创建表的时候导入数据:CREATE TABLE table_name(column_name column_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 'hdfs_file_path';
- 数据导出:INSERT OVERWRITE LOCAL DIRECTORY 'local_file_path' SELECT * FROM table_name WHERE column_name = value;
- 数据导出(hive shell方式):bin/hive -e "SELECT * FROM table_name" > local_file_name 加where需要外面双引号,里面单引号
- 数据导出(hadoop方式):dfs -get hdfs_file_path local_file_path
- 清空表格:TRUNCATE TABLE table_name;
运算符 | 描述 |
---|---|
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 相除 |
% | 取余 |
1 | 按位取或 |
^ | 按位异或 |
~ | 按位取反 |
- 工资大于1700的员工信息:SELECT * FROM table_name WHERE column_name >1700;
- 工资小于1800的员工信息:SELECT * FROM table_name WHERE column_name <1800;
- 查询工资在1500到1800之间的信息:SELECT * FROM table_name WHERE column_name BETWEEN 1500 AND 1800;
- 查询有奖金的员工信息:SELECT * FROM table_name WHERE column_name IS NOT NULL;
- 查询无奖金的员工信息:SELECT * FROM table_name WHERE column_name NOT NULL;
- 查询工资是1700或1900的员工信息:SELECT * FROM table_name WHERE column_name IN(1700,1900);
- 使用场景:
- 选择类似的值
- 选择条件可以包含字母和数字
- 案例
- 查询员工薪水第二位为6的员工信息:SELECT * FROM table_name WHERE LIKE '_6%';
- 注:_ 表示一个字符,% 表示0-n个字符
- 查询员工薪水包含7的员工信息:SELECT * FROM table_name WHERE LIKE '%7%';
- 计算empt表中每个部门的平均工资
SELECT AVG(empt.sal) AS avg_sal,empt.deptno FROM empt GROUP BY empt.deptno; - 计算empt每个部门中最高的薪水
SELECT MAX(empt.sal) AS max_sal, empt.deptno FROM empt GROUP BY empt.deptno; - 计算部门的平均薪水大于1700的部门
SELECT AVG(empt.sal) AS avg_sal,empt.deptno FROM empt GROUP BY empt.deptno HAVING avg_sal>1700;
注意:如果想在分组GROUP BY后面加条件需要用 HAVING,HAVING只用于GROUP BY分组统计语句中,WHERE 后面不能写GROUP BY函数
- 已有数据表
- 等值Join
- 左外连接LEFT JOIN
- 右外连接RIGHT JOIN
- 当右边的表比左边多的时候使用,当左边没有情况,会用null替代
- SELECT d.deptno,e.empno,e.ename,d.dept FROM empt e RIGHT JOIN dept d ON e.deptno=d.deptno;(查询结果和左连接一样)
- 多表连接查询
- 简介: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y, 第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
- 错误的写法,避免:select ename,dept from empt,dept;
- 规避笛卡尔积方法
- 全局排序ORDER BY
- 查询员工信息按照升序排序
- 默认:SELECT * FROM empt ORDER BY sae ASC;
- 降序:SELECT * FROM empt ORDER BY sae DESC;
- 查询员工号与员工薪水按照员工二倍工资进行排序
SELECT empt.empno, empt.sae*2 twosal FROM empt ORDER BY twosal;
- 分区排序SORT BY
- 分区表按照员工编号降序
SELECT * FROM empt DISTRIBUTE BY deptno SORT BY empno DESC;
- 用途:主要运用到抽样,数据进行预判
- 分区&粪桶区别
- 分区表分的是数据的存储路径
- 分桶表分的是文件
- 分桶表创建
CREATE TABLE emp_buck(id int,name string)
CLUSTERED by(id) --- 通过什么字段分桶
INTO 4 BUCKETS --- 分为几通
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; - 清空表格:TRUNCATE TABLE table_name;
- 设置属性,开启分桶操作:
- 查询mapreduce的job配置:set mapreduce.job.reduces; -1表示未设置reduce数量
- 查询属性:set hive.enforce.bucketing;
- 设置属性:set hive.enforce.bucketing=true;
- 三种自定义函数
- UDF:一进一出(User-Defined-Function)
- UDAF:多进一出(count、max、min)
- UDTF:一进多出
- 自定义函数步骤:
- IDEA编码,示例:
package com.along.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @author :FinalLong
* @version :1.0
* 类说明
*/
public class Lower extends UDF {
// 需求是大写转小写
public String evaluate(final String s) {
// 判断是否有字母,如果没有则直接
if(s==null) {
return null;
}
return s.toString().toLowerCase();
}
}
- 打包为jar包。推荐:使用Maven插件打包
- 上传到HIVE环境中
- 启动HIVE并加载到环境中:add jar /root/lower.jar;
- 根据jar关联方法:CREATE TEMPORARY FUNCTION my_lower AS "com.along.hive.Lower";
- 使用自定义方法: SELECT ename,my_lower(ename) lowername FROM empt;
- 开启压缩优化
- 开启Map阶段输出压缩
- 查看hive压缩功能状态:set hive.exec.compress.intermediate;
- 开启hive压缩功能:set hive.exec.compress.intermediate=true;
- 开启map端的压缩功能:set mapreduce.map.output.compress=true;
- 设置map端的压缩方式:set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
- 开启Reduce阶段的输出压缩
- 开启hive输出的压缩功能:set hive.exec.compress.output=true;
- 开启Reduce端的压缩功能:set mapreduce.output.fileoutputformat.compress=true;
- 设置Reduce端的压缩方式:set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
- 设置Reduc输出压缩的类型:set mapreduce.output.fileoutputformat.compress.type=BLOCK;
- 测试:insert overwrite local directory '/root/compross/rsout' select * from empt sort by empno desc;
- 存储优化
- Hive存储格式:TextFile(default)/SequenceFile/orc/Parquet
- orc/Parquet:按照列存储
- 行存储:查询速度快,因为是只需要找到第一列,其他的按照顺序的,使用在列较多情况
- 列存储:如果查询的字段较少,效率会较高,使用列较少情况
- orc特点:
- Index Data,是一个轻量级的索引,默认每隔1万行做一次索引;
- row Data 存储的为具体的数据;
- stripe Footer存储的流的类型,例如长度
- Parquet:解决版本依赖的问题
- 压缩比例:orc > parquet > textFile
- 查询效率:orc > textFile
- 修改Hive存储格式
2. 创建表,需要指定存储格式
CREATE TABLE itstar_log(time bigint,host string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS orc; 2. 导入数据到普通表,因为指定了存储格式,不能直接导入
CREATE TABLE itstar_temp(time bigint,host string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
LOAD DATA LOCAL INPATH 'root/itstar.log' INTO TABLE itstar_temp; 2. 迁移到指定了格式的表中 INSERT INTO TABLE itstar_log SELECT * FROM itstar_temp; 2. HDFS观察大小
- GROUP BY优化
- 合理避免数据倾斜
1.1 合理设置Map数量,并不是越多越好,过多业务处理时间还没有开启、初始化的时间更少
1.2 小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 1.3 合理设置Reuce数量 2 JVM重用:- 一般设置task的任务10-20之间
- 修改配置文件:mapreduce.job.jvm.numtasks(mapred-site.xml)
- 减少程序的执行时间