浅谈Hive之第一讲

Hive

1. Hive基础入门
2. Hive安装配置
3. Hive数据定义语言DDL
4. Hive数据操作DML
5. Hive查询基础
6. Hive高级应用
7. Hive优化
8. Hive案例

hive为什么存在?
facebook最初用来研发处理海量的社交数据和机器学习
简化分析操作,使用sql
mapreduce开发效率较低,hive的效率比较高

hive是什么
hive是一个大数据仓库
hive是一个基于hadoop的大数据仓库
hive是一个基于hadoop的数据仓库,可以通过类sql语句来对数据进行读、写、管理(元数据管理)。

为什么使用Hive
直接使用hadoop所面临的问题
人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大

为什么要使用Hive
操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。
功能扩展很方便。

hive的特点
1. 可扩展
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
2. 延展性
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
3. 容错性高
良好的容错性,节点出现问题SQL仍可完成执行。

hive的架构
1. 用户连接客户端: cli、jdbc/odbc、web GUI
2. thrift server: 第三方服务
3. metastore: hive的元数据(库名、表名、字段名、字段类型、分区、分桶、创建时间、创建人等)管理
4. 解释器: 将hql语句生成抽象表达式树
5. 编译器: 对hql语句进行语法、词法、语言的编译(此时需要联系元数据),编译完成后会生成一个有向无环的执行计划。
6. 优化器: 将执行计划进行优化,减少不必要的列,使用分区等。
执行器:将优化后的执行计划提交给hadoop的mapreduce框架去执行。

hive和hadoop的关系
hive基于hadoop,hive本身没有存储和分析的功能。hive就相当于在hadoop之上加了一个外套,hive的存储依赖于hdfs,hive的分析依赖于mapreduce

mysql和hive的区别:
mysql用自己的存储存储引擎,hive使用的hdfs来存储。
mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。
mysql使用环境环境几乎没有限制,hive是基于hadoop的。
mysql的低延迟,hive是高延迟。
mysql的handle的数据量较小,而hive的能handle数据量较大。
mysql的可扩展性较低,而hive的扩展性较高。
mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。
mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。

hive的安装
hive有3种安装模式(hive会自动检测hadoop的环境变量,如果有就必须先启动hadoop)
1、本地模式(多用户)
使用hive自带的默认元数据库derby来进行元数据的存储管理,通常用于测试
优点:使用简单,不需要进行配置
缺点:只支持单session。
安装步骤:
1、上传并解压tar包,然后配置环境变量

hive的本地模式会在执行hive命令的目录下创建一个derby数据库,如果目录已存在,则尝试连接该derby数据库。但是derby库一次只允许一个客户端进行连接,所以本地模式只支持单session

2、远程模式(元数据在该台服务器上)
通常使用关系型数据库来进行元数据存储(mysql、sqlserver、oracle等待jdbc驱动的数据库)
**优点:**支持多session。
**缺点:**需要配置、还需要安装mysql、oracle等关系型数据库
1、上传并解压安装包,并配置环境变量
2、配置配置文件
配置hive-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_60
配置hive-site.xml

<configuration>
<!--指定mysql数据库的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.137.21:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>

<!--指定连接mysql的驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>

<!--指定连接mysql服务器的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>

<!--指定连接mysql用户的登录密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>

3、将mysql的连接驱动包cp到hive的安装目录下的lib目录中
4、在指定的数据库中创建元数据库,数据库的编码设置为latin1。
5、启动测试

3、远程模式(元数据不在该台服务器上)
通常使用关系型数据库来进行元数据存储(mysql、sqlserver、oracle等待jdbc驱动的数据库)

hive的操作
1、hive的默认分隔符是\001
2、创建表

create table if not exists t2(
id int,
name string
)
row format delimited
fields terminated by ','
;

加载数据:
1、insert into values
2、直接将数据文件上传到hdfs的表目录下
3、load方式加载数据到表目录下

load data local inpath '/hivedata/stu1.txt' into table t2;

hive有一个默认的数据库,叫default,操作hql时如果不指定数据库则默认使用default库
注释:
//

/**
*/

hive数据库名、表名不区分大小写
1、名字不能使用数字开头,不能使用全数字
2、不能使用关键字
3、尽量不要使用特殊符号

创建库:

create database if not exists 1918db; 

创建库的本质:
在hive的数据仓库目录下 /user/hive/warehouse 创建一个目录(库名.db)

切换库:
use gp1918;

创建表:

create table if not exists t1(
uid int,uname string) 
row format delimited 
fields terminated by ',';

创建表的本质:
在指定的数据库目录下创建一个以表名命名的目录

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]

create external table if not exists t2(
uid int,
uname string
)
row format delimited 
fields terminated by ','
;

create external table if not exists t3(
uid int,
uname string
)
row format delimited 
fields terminated by ','
location '/t3'
;

HIVE中表的类型:
1、内部表 表目录会创建在hdfs的/user/hive/warehouse下的相应的库目录中
2、外部表 外部表会根据建表时LOCATION关键字指定的路径来创建表目录(如果没有指定LOCATION,则表目录的位置与内部表相同的)

内部表的创建和外部表的创建,就差两个关键字:EXTERNAL ,LACATION

内部表 – CREATE TABLE IF NOT EXISTS T_INNER(ID INT);
外部表 – CREATE EXTERNAL TABLE IF NOT EXISTS T_OUTER(ID INT) LOCATION ‘hdfs://namenode:9000/AAA/BBB/XXX’
LOCATION后面带的时hdfs之上的目录,这个目录可以存在

hive中建表语句所做的两件事:
1、在hdfs上创建对应的目录
2、在元数据库中创建相应表的描述信息(元数据)
HIVE中删除表时不同特性:
1、删除表时,元数据信息会被清除
2、删除表时,内部表的表目录会被删除,但是外部表的表目录不会被删除

所以,整个数据仓库的最底层的表(与数据仓库外的数据库对接的表,ODS层)就是使用咱们的外部表

删除表:
删除表的本质:删除表对应的目录

**加载数据的本质:**将数据copy(不完全是copy)到表对应的目录

load data inpath '/hivedata/stu.txt' into table t3;

如果文件在hdfs之上,则加载数据的本质是移动数据move数据

加载数据:
2、hdfs dfs -put
3、load
4、数据库操作

insert into select
insert into table t4
select uid,uname 
from t3
where uid < 3
;

hive中语句的结束以分号结束,语句一碰到分号就会执行
hive中数据是严格的读时模式,如果数据不匹配,则使用NULL值来代替
mysql是严格的写时模式,如果写的时候数据不匹配,则直接报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值