Hive高级01
一、重温1、产生背景2、部署(没有集群的概念,它仅仅是客户端)3、DDL4、DML5、JOIN6、function:build-in & udf7、Sqoop二、Hive高级1、hive cli:1)hive/webui/beeline/Java API2、看官网https://cwiki.apache.org/confluence/displ...
一、重温
1、产生背景
2、部署(没有集群的概念,它仅仅是客户端)
3、DDL
4、DML
5、JOIN
6、function:build-in & udf
7、Sqoop
二、Hive高级
1、hive cli:
1)hive/webui/beeline/Java API
2、看官网https://cwiki.apache.org/confluence/display/Hive/
Hive Clients
- Hive Client (JDBC, ODBC, Thrift)
- HiveServer2: Overview, HiveServer2 Client and Beeline, Hive Metrics
beeline/Java API 连上 HiveServer2:client发起sql
3、启动 HS2(注意要先打开HDFS)
4、打开Beeline官方文档
5、根据提示启动
根据官方文档提示要输入的命令:
!connect jdbc:hive2://192.168.137.131:10000 scott tiger(默认端口号10000、用户名:scott、密码:tiger)
PS:
大数据中著名的端口:
HDFS:50070 8020
YARN:8088
SPARK:4040 7077
MAPREDUES:60010
成功:
总结:连接10000端口拒接链接的时候可以按一下步骤排查
(1)先开启 metastore(hive --service metastore &),根据报错解决问题。一般没启动Mysql或者有些进程互斥要kill掉该进程再重启metastore(Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083,需kill -9 runjar)。
(2)再开启 hiveserver2
(3)beeline输入命令
三、beeline
1、最好如下启动beeline
beeline -u jdbc:hive2://192.168.137.131:10000/default -n HBinz
2、修改默认端口号
看官网文档: Hive Configuration Properties
hiveserver2 --hiveconf hive.server2.thrift.port=14000
3、重连
beeline -u jdbc:hive2://192.168.137.131:14000/default -n HBinz
四、JDBC
1、创建org.apache.maven.archetypes:maven-archetype-quickstart项目
2、pom.xml添加如下依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
3、点击官网文档
4、拷贝其中代码
5、alt+enter 导入需要的class进来
import java.sql.*;
6、JDBC的操作方式
1)Java通过JDBC的方式操作数据库
(1)Class.forName(driverNmae)
(2)Connection
(3)Statement
(4)ResultSet
7、编写查询的JDBC代码
import java.sql.*;
public class JdbcApp {
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
Connection con = DriverManager.getConnection("jdbc:hive://hadoop001:10000/default", "HBinz", "123456");
Statement stmt = con.createStatement();
String tableName = "hive_rownumber";
String sql = "select * from hive_ruwnumber"
ResultSet res = stmt.executeQuery(sql);
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1));
}
}
}
8、查看表结构
desc formatted hive_rownumber;
四个字段分别是Int Int String String类型
所以最后输出res要分别get这四个类型的值
import java.sql.*; public class JdbcApp { private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } Connection con = DriverManager.getConnection("jdbc:hive://hadoop001:10000/default", "HBinz", "123456"); Statement stmt = con.createStatement(); String tableName = "hive_rownumber"; //stmt.executeQuery("drop table " + tableName); String sql = "select * from hive_ruwnumber"; ResultSet res = stmt.executeQuery(sql); // show tables // String sql = "show tables '" + tableName + "'"; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getInt(1) +"," + res.getInt(2) + "," + res.getString(3) + "," + res.getString(4)); } } }
9、执行
报错找不到这个驱动
10、修改1
11、报错2
12、修改2
13、成功
总结:
1)官方文档有两处错处:
(1)org.apache.hadoop.hive.jdbc.HiveDriver应为
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
(2)jdbc:hive://192.168.137.131:10000/default应为
url:"jdbc:hive2://192.168.137.131:10000/default"
(3)HS2没开,JDBC的报错:
java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop000:14000/
五、Hive WEB UI
1、WEB操作界面
1)Hive官方的不建议使用
2)HUE:Hadoop User Experience(http://github.com/cloudera/hue)
3)zeppelin(spark建议使用)
六、数据类型
1、基础数据类型
2、复杂数据类型:array、map、struct
1)根据你所需要的复杂数据类型创建表
2)取数据
(1)array
【1】查看官方怎么将字段中array类型的元素按规律分割
create table hive_array(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ',';
load data local inpath '/opt/data/hive_array.txt' overwrite into table hive_array;
【2】查看数组长度
size()
select name,size(work_locations) from hive_array;
【3】查看数组首位
xx[0]
select name,work_locations[0] from hive_array;
【4】查工作地点有天津的人
array_contains(work_locations,'tianjin')
(2)map -键值对
Map(key:value,key:value,,,,,,)如
Map('a',1,'b',2)或者Map('a'#1,'b'#2)
【1】查看官方怎么将字段中map类型的元素按规律分割
我们观察内容,map里面item的分隔符应该是#,key-value的分隔符应该是:;
create table ruoze_map(id int,name string, family map<string,string>,age int)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED BY '#' MAP KEYS TERMINATED BY ':';
load data local inpath '/opt/data/hive_map.txt' overwrite into table ruoze_map;
成功:
【2】map取值
字段名["key"]
select id,name,family['father']as father,family['sisther'] from ruoze_map;
【3】取字段map类型中的各种关系
map_keys(字段名)
select id,name,map_keys(family) from ruoze_map;
同理查values
select id,name,map_values(family) from ruoze_map;
【4】查有多少亲属关系
size(字段名)
select id,name,size(family) from ruoze_map;
【5】查亲属关系有brother的人
array_contains(map_keys(family),'brother')
将map的key转化为数组,然后再进行数组的比对
select id,name,family['brother'] from ruoze_map where array_contains(map_keys(family),'brother')
七、struct
【1】查看官方怎么将字段中stuct类型的元素按规律分割
create table ruoze_struct(ip string,userinfo struct<name:string,age:int>)row format delimited fields terminated by '#' COLLECTION ITEMS TERMINATED BY ':'; load data local inpath '/opt/data/hive_struct.txt' overwrite into table ruoze_struct;
【2】用.方法取数据
select ip,userinfo.name,userinfo.age from ruoze_struct;
八、Hive存放数据的位置
Hive底层的工作原理是将sql翻译成mapreduce,它的数据存放在以下:
1、元数据
查conf得知存放在
2、研究表
(1)version表
如果没version表格Hive是启动不起来的。
SCHEME_VERSION:Hive的版本
VERSION_COMMENT:由HBinz这个用户,192.168.137.131这个IP创建的
Hive是一个进程级别,不会出现多线程的问题。
SPARK是多线程的应用,在某些临界的情况下,可能会在VERSION表加入一条数据,而VERSION表有且只有一条才可以启动。
SHELL脚本定时监控VERSION表,如果新增就把新增的删除掉。
(2)DBS
(3)DATABASE_PARAMS select * from database_params (4)TBLS
select * from tbls
Hive里面的数据库对应SQL里面的DB_ID
Hive里面的数据库里的table对应TBLS里面的row
Hive里面的表的信息也是从mysql这个地方来的。比如TBL_NAME,TBL_TYPE
(5)Hive的字段类型怎么来?COLUM_V2d
CD_ID又跟SD_ID有关。
(5)分区表
SQL:
keys:
0:第一个分区
1:1后面的分区
TBLS和DBS是通过DB_ID关联的
2、JOIN
(1)执行计划 explain[extended] sql语句
ABSTRACT SYNTAX TREE <== 带extended的话,会显示抽象语法树
STAGE DEPENDENCIES
STAGE PLANS
(2)SQL on Hadoop
common join/shuffle join/reduce join 有shuffle
mapjoin/broadcastjoin 没有shuffle 通常上性能高于上面,但是有前提。
Hive_Join的处理逻辑:
emp
empno, ename, deptno
map:<deptno, (empno, ename, deptno)>
ruoze_dept
dname,deptno
map:<deptno, (dname,deptno)>
shuffle: 相同的key分发到一个reduce task上去执行
<deptno, (empno, ename,dname)> 把多余相同的deptno去掉。
join的过程其实真正是发生在reduce阶段的
通过执行计划验证性差。由于高版本Hive默认mapjoin,所以需要修改设置。
(3)看官网
hive.auto.convert.join
先改为false,取消mapperjoin
set hive.auto.convert.join=false;
(4)mapperjoin
join发生在map阶段,无shuffle
前提:大表join小表
原理:把小表加入到分布式缓存中去,在读取大表的时候,直接和分布式缓存中的数据匹配,匹配上就ok,匹配不上就滚蛋
set hive.auto.convert.join=true;
select /*+mapjoin(d)*/ e.empno,e.ename,d.dname from emp e join ruoze_dept d on e.depnto=d.deptno;
hint
/*+mapjoin(d)*/:这个标识哪个是大表,由高版本Hive系统完成,不需人工判断。
九、压缩(必考)
大数据 ==> HDFS <==压缩
1、好处
1)disk磁盘空间减少
2)file文件大小减少
3)shuffle占用的网络减少
4)I/O减少
2、坏处
1)CPU增加
3、压缩技术:
有损
无损
4、压缩常用的场景
1)map输入
2)map输出
3)reduce输出
更多推荐
所有评论(0)