hive学习教程

1、Hive体系架构

如图3-1所示,Hive体系架构可以分为4部分。

image-20200924230513156

1.1❑用户接口。

用户与Hive交互主要有3种方式:CLI(Hive命令行模式)、Client(Hive的远程服务)和WUI(Hive的Web模式)。CLI方式主要用于Linux平台命令行查询。WUI方式是Hive的Web界面访问方式,通过浏览器访问Hive。Client是Hive的客户端,连接至远程服务HiveServer2。

1.1.1 JDBC连接Hive代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test{
	public static void main(String[]args){
			Class.forName("org.apache.hive.jdbc.HiveDriver");
			Connection conn=DriverManager.getConnection("jdbc:hive2://192.168.0.130:10000/testhive","root","");
			String sql="create table emp(empno int,ename string,job string)row format delimited fields terminated by','";
			PreparedStatement ps =conn.prepareStatement(sql);
			ps.execute);
}
}

1.2❑元数据存储。

Hive将元数据存储在数据库中,如MySQL、Derby等,其中元数据存储依赖于Metastore DB服务。Hive中的元数据包括表名、表的列和分区及其属性、表的属性(是否为外部表)、表的数据所在目录等。

1.3❑解析器、编译器、优化器。

完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成,随后由MapReduce调用执行。

1.4❑数据存储。

Hive中表的数据存储在HDFS中,包含表(Table)、外部表(External Table)、分区(Partition)、桶(Bucket)等数据模型,其中数据库、分区、表都对应HDFS上的某个目录,Hive表里的数据存储在表目录下面。

  • ***外部表和表主要区别是对数据的管理。***External Table数据存储在建表时由Location指定的目录中,且当删除External Table时,只删除表的结构,而不删除数据。

2、Hive支持的数据类型

2.1 基础数据类型

image-20200928112816892

2.2 复杂数据类型

(1)ARRAY

ARRAY类型是由一系列相同数据类型元素组成的,这些元素可以通过下标来访问,ARRAY类型的下标是从0开始的。例如user是一个ARRAY类型,由[‘firstname’, ‘lastname’]组成,那么可以通过user[1]来获取该用户的lastname。

(2)MAP

MAP包含key→cfvalue键值对,可以通过key来访问元素。例如user是一个map类型,其中name是key, age是value,那么可以通过user[‘name’]来获取对应的age。

(3)STRUCT

STRUCT可以包含不同数据类型的元素。这些元素可以通过“点语法”的方式来获取。例如user是一个STRUCT类型,那么可以通过user.age得到该用户的年龄。

3、HiveSQL语句

  • hive不支持事务及更新操作,延迟比较大

3.1 Hive创建表语句

CREATE [ EXTERNAL] TABLE [ IF NOT EXISTS][ db_name.] table_name
[(col_name data type [ COMMENT col_comment],..)]
[ PARTITIONED BY (col_name data_type,...)]
[ CLUSTERED BY (col_name, col name,...)[ SORTED BY (col_name [ ASCI DESC],...)]
INTO num_buckets BUCKETS]
[ ROW FORMAT row_format][ STORED AS file_format]
[ LOCATION hdfs_path]

其中,参数说明如下:

(1)CREATE TABLE:

创建一个指定名字的表。如果相同名称的表已经存在,则抛出异常;用户可以使用IF NOT EXISTS这个选项来忽略这个异常。

(2)EXTERNAL:

该关键字可以让用户创建一个外部表,在建表的同时使用LOCATION关键字指向数据存储路径。外部表在删除时,只删除其对应的元数据,而不删除数据。

(3)COMMENT:

用作字段的注释。

(4)PARTITIONED BY:

指定分区表的分区字段,可以为多个字段。

(5)CLUSTERED BY:

Hive中Table可以拆分成PARTITION, Table和PARTITION可以通过PARTITIONED BY进一步分为Bucket, Bucket中的数据可以通过CLUSTERED BY对数据排序。

(6)STORED AS:

指定Hive文件存储格式,Hive存储格式有以下4种:

●TEXTFILE格式

默认格式,数据不压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,Hive不会对数据进行切分,从而无法对数据进行并行操作。

●SequenceFile格式

是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。SequenceFile支持3种压缩选择:NONE、RECORD、BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

●RCFILE格式

是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个块。其次,块数据列式存储,有利于数据压缩和快速的列存取。

(7)LOCATION:

创建外表时,指定数据在HDFS上的存储目录。

3.2 Hive中定义表有5种方式

3.2.1 创建内表
CREATE TABLE customer(customerID INT, firstName STRING, lastName STRING, birthday TIMESTAMP)
ROW FORMAT DELIMITED FIELDS TERMINATED BY',';  --表示指定使用“, ”分隔每列数据
3.2.2 创建外表
CREATE EXTERNAL TABLE salaries(gender string, age int, salary double, zip int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY',
'LOCATION '/user/trai n/salaries/'; --指定数据存储位置(默认存储在hive-site.xml中hive.metastore.warehouse.dir对应目录下面)
3.2.3 创建静态分区表
--1、创建employees表
CREATE TABLE employees(id int,name string,salary double,depts string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
--2、导入数据到employees表
LOAD DATA LOCAL INPATH'/data/employees part.txt'OVERWRITE INTO TABLE employees;
--3、创建静态分区表employees_part 
CREATE TABLE employees part(id int,name string,salary double,depts string)
PARTITIONED BY(dept string)ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
--4、导入数据到静态分区表employees_part 
INSERT OVERWRITE TABLE employees part PARTITION(dept='SALES'SELECT * FROM employees WHERE depts='SALES';
3.2.4 创建动态分区表
--1、创建student表
CREATE TABLE student(
id int,name string,score double,classes string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
--2、导入数据到student表
load data local inpath'/data/students.txt' overwrite into table student;
--3、创建动态分区表student_dynamic 
set hive.exec.dynamic.partition=trueset hive.exec.dynamic.partition.mode=nostrict;
CREATE TABLE student_dynamic(
id int,name string,score double,classes string)
PARTITIONED BY(class string)ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
--4、导入数据到动态分区表
INSERT OVERWRITE TABLE student_dynamic PARTITION(class)SELECT *,classes FROM student;
3.2.5 创建带有数据的表
--创建stu表,并导入数据
CREATE TABLE stu(id int, name string, score double, classes string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 
LOAD DATA INPATH '/data/students. txt' OVERWRITE TABLE stu;

3.3 数据导入

LOAD DATA [ LOCAL] INPATH ' filepath'[ OVERWRITE] INTO TABLE tablename
[ PARTITION(partcol1=val1, partcol2=val2...)]

导入语句带有LOCAL关键字,那么LOAD命令会查找本地文件系统中的filepath。如果没有LOCAL关键字,那么就会查找HDFS上面的路径。这里建议使用绝对路径。

3.4 数据导出

INSERT OVERWRITE [LOCAL] DIRECTORY '路径' ROW FORMAT DELIMITED FIELDS TERMINATED BY','
SELECT字段1,字段2,字段3FROM表名;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarvis数据之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值