Hive,
文章目录
- 简介
- 资料
- Hive命令
- DDL
- DML
- DQL
- Hive在Linux下相关命令
- Hive UDF
- Hive连接方式
- JDBC-Demo
- Tips
简介
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
简言之,尽管Hive是基于HDFS作为数据存储,基于MapReduce作为数据计算引擎,但它的查询语法与传统的关系型数据库,例如MySQL,非常类似。
但另一方面,Hive是为了数据仓库而设计的,除了SQL和HQL之间的相似性,结构方面再无类似之处。
Hive主要用于数据仓库的建设基石,由于其查询速度较慢,因此一般用于离线的批处理工具。
资料
Hive的学习资料网上很多;珠玉在前,这里不再赘述。总结如下,可时常温习。
动物书系列的《Hive编程指南》
官方文档,配合翻译插件食用更佳:https://hive.apache.org/
官方wiki:https://cwiki.apache.org/confluence/display/Hive
https://www.cnblogs.com/qingyunzong/p/8707885.html
http://blog.fens.me/hadoop-hive-roadmap/
https://blog.csdn.net/nsrainbow/article/details/41748863
https://www.yiibai.com/hive/
Hive命令
DDL
# 库相关
create database if not exists db_name <hql>; -- 建库
drop database if exists db_name; -- 删库
show databases like 'db_name.*' -- 正则筛选数据库名
# 函数相关
show functions;
describe function func_name;
describe function extended func_name;
# 表相关
# 建表语句模板
create table db_name.t_name (
country string comment `国家`
, people int comment `人口数量`
-- ......
)
create temporary table table_name as <hql>; -- 创建临时表
create table if not exists new_table like old_table; -- 拷贝表结构到新表
create table new_table as select * from old_table; -- 拷贝表结构及数据到新表
insert overwrite table new_tableselect * from old_table; -- 重写表数据到另外的表
insert into table new_table select * from old_table; -- 插入表数据到另外的表
insert overwrite table table_name
select * from table_name where <condition>; -- Hive删除表中部分数据
DML
# 重命名表
alter table new_table rename to old_table;
# 新增字段
alter table table_name
add columns(col_name int comment 'com_name')
# 移动表中字段位置
alter table table_name
change column col_name_1 after col_name_2;
# 改变列名/类型/位置/注释
ALTER TABLE table_name CHANGE
[CLOUMN] col_old_name col_new_name column_type
[CONMMENT col_conmment]
[FIRST|AFTER column_name];
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
DQL
# 显示字段名
set hive.cli.print.header = true;
# 字段名省略表名前缀
# 可将上述两条语句写入.hiverc这个hive的配置文件里面,使得每次启动Hive的时候默认这样设置
set hive.resultset.use.unique.column.names = false;
# 使用本地模式,减少使用MapReduce,从而加快查询速度
set hive.exec.mode.local.auto = true;
# Hive时间函数
select current_timestamp; -- 此刻时刻
select current_date; -- 今天日期
select unix_timestamp; -- unix时间
date_add('2018-01-01', -10); -- 十天之前的日期
date_add('2018-01-01', 1 - dayofweek('2018-01-01')) -- 本周第一天_周日
add_months('2019-01-01', 10); -- 增加十个月
date_diff('2019-01-01', '2018-01-01') -- 日期差值
trunc(current_date,'MM') -- 当月第一天
last_day(current_day) -- 当月最后一天
trunc(current_date,'YY') -- 当年第一天
weekofyear('2018-01-01') -- 当年第几周
next_day(current_day, 'TU') -- 下个星期二
second('2018-01-01') -- 秒
minute('2018-01-01') -- 分
hour('2018-01-01') -- 小时
day('2018-01-01') -- 天
month('2018-01-01') -- 月
lpad(ceil(month(day)/3), 2, 0) -- 季度
year('2018-01-01') -- 年
# 时间格式的转换
-- 20171205转成2017-12-05
select from_unixtime(unix_timestamp('20171205','yyyymmdd'), 'yyyy-mm-dd');
-- 2017-12-05转成20171205
select from_unixtime(unix_timestamp('2017-12-05','yyyy-mm-dd'), 'yyyymmdd');
# Hive解析json
get_json_object(col_name, '$.key_1');
get_json_object(col_name, '$.key_1.key_2.key_3'); -- 解析多层嵌套
# Hive将分数转化为百分数显示,并保留两位小数
concat(round(100 * 1/3, 2), '%');
# 常用函数
coalesce(p1, p2, p3) -- 若p1为空,则取p2,依次类推
# 将csv文件直接加载到hive表中:
# Step1. 建表,在建表语句末尾加上
ROW format delimited fields terminated by ',' STORED AS TEXTFILE;
# Step2. 在Hive中使用下列语句
load data local inpath 'file_path' into table table_name;
# 不能再beeline中使用这句,因为beeline和hive的服务器不一定相同,则其文件路径也不相同
Hive在Linux下相关命令
# 添加alias命令别名
# Step1. 在你的登录用户目录下,显示所有隐藏文件,找到.bashrc;
# Step2. 编辑.bashrc文件,在最后加上格式为 alias h='hive' 的代码;
# Step3. 在Linux shell下,输入'h',即可实现输入'hive'的效果;
# 使用beeline。先进入beeline,然后输入:
!connect jdbc:hive2://111.22.33.44:10000 # beeline服务器站点
# 在.bashrc中添加beeline的alias
alias beeline='beeline -n username -p paseword -u jdbc:hive2://172.16.97.31:10000'
# 在hql脚本中添加参数(下例中引用两个参数)
time hive --hivevar para_a = '2019-01-01' -hivevar para_b = '2020-01-01' -f hql_file >> file_name.xlsx
Hive UDF
Step 1. 用Java写好函数,并打成Jar包;
Step 2. 将Jar包导入Linux或hdfs;
Step 3. 执行语句,add jar…
create temporary function func_name as ‘…’
https://blog.csdn.net/yu0_zhang0/article/details/79060849
Hive连接方式
-
CLI
直接在Linux中输入’hive’,进入Hive使用界面;- 原生Hive;
- Beeline
在Linux中输入’beeline’,输入账号密码,进入Beeline界面操作hive。Beeline相当于对Hive的一层封装,使之使用的更顺手;
-
GUI
- Hue:在Hue的网页界面,能直连Hive数据库,并将结果在网页端展示出来;
- DBEave小松鼠客户端
-
JDBC
Javadoc - Hive 3.1.0 API
JDBC-Demo
实现功能:用Java连接Hive,并查询lin库里面的test表。
1、首先,在Linux中启动hiveserver或hiveserver2,在shell中输入代码hive –service hiveserver >/dev/null 2>/dev/null &或hiveserver2 &
2、新建Maven工程,在pom.xml中增加依赖,代码如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>uni.scut</groupId>
<artifactId>hadoop_java</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
</project>
3、新建HiveDemo.java,代码如下
# 通过Java API对Hive查询
package Hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class HiveDemo {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");
// lin为Hive的某个数据库名
Connection connection = DriverManager.getConnection("jdbc:hive2://bigdata85:10000/lin", "", "");
Statement stmt = connection.createStatement();
// hive中的查询语句
String querySQL="select * from test";
ResultSet res = stmt.executeQuery(querySQL);
while (res.next()) {
System.out.println(res.getInt(2));
}
}
}