一、重温

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

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输出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐