1、Hive是什么?
用sql来做hdfs的查询(用户输入的是sql,框架内部把sql转成mapreduce的任务,然后再去跑分析)
Hive 是建立在 Hadoop 上的数据仓库(Data Warehouse)基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据。
Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上
2、Hive的存储格式
1)TextFile
Hive默认,正常文本格式,此格式的表文件在HDFS上是明文(可直接查看到元数据)
2)RCFile(一班用ORC)
是hadoop中第一个列文件格式,是行列存储相结合的存储方式,极致速度
3)Parquet
存储结构化数据,如k:v
3、Hive基本操作
1.创建shujia数据库
create database shujia;
2.切换shujia数据库
use shujia;
3.创建students表(外部表)
create external table students(
id bigint comment '学生id',
name string comment '学生姓名',
age int comment '学生年龄',
gender string comment '学生性别',
clazz string comment '学生班级'
) comment '学生信息表'
row format delimited fileds terminated by ','
stored as textfile
location '/data/stu';
4.创建score表(外部表)
create external table score(
id bigint comment '学生id',
score_id bigint comment '科目id',
score int comment '学生成绩'
) comment '学生成绩表'
row format delimited fileds terminated by ','
stored as textfile
location '/data/scores';注意:外部表删除表时不会删除表中数据
5.查看表信息
desc students;
desc score;
6、查看表信息
desc students;
desc score;
6.清空表
truncate table 表名;
7.删除表
drop table 表名;
8.查看建表语句
show create table 表名;
9.查看表的详细信息
desc formatted 表名;
10.查看所有表
show tables;
4、Hive的JDBC连接方式
与Java操作MySQL步骤类似
1)先开启 hiveserver2: hive --service
[root@master~]#hiveserver2 &
2)添加maven依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
3)使用IDEA编写JDBC代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class HiveTest {
public static void main(String[] args) throws Exception{
//加载包
Class.forName("org.apache.hive.jdbc.HiveDriver");
//连接
Connection conn = DriverManager.getConnection("jdbc:hive2://master:10000/shujia");
//获取执行器
String sql="select * from students";
PreparedStatement ps = conn.prepareStatement(sql);
//数据处理
ResultSet rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("name"));
}
//关闭
rs.close();
ps.close();
conn.close();
}
}