hive学习
- 1.hive介绍
- 2.hive基本操作
- 2.1 查数据库
- 2.2 创建park数据库
- 2.3 进入park数据库
- 2.4 查看表
- 2.5 创建stu表
- 2.6 创建一个和表stu结构一样的stu2表
- 2.7 向表stu插入数据(会产生临时表)
- 2.8 查看表stu数据
- 2.9 查看表stu结构
- 2.10 删除表stu
- 2.11 创建stu表,并指定分割符 空格
- 2.12 通过加载文件数据到指定的表stu里(写入的数据是递增的)
- 2.13 把stu表数据插入到stu1表中
- 2.14 将stu表中查询的数据写到本地的/opt/stu目录下
- 2.15 将stu表中查询的数据写到HDFS的stu目录下
- 2.16 将stu表中查询的数据写到stu1以及stu2两张表中
- 2.17 为表stu重命名为stu2
- 2.18 为表stu增加一个列字段age,类型为int
- 2.19 注意点
- 3.python连接hive
- 4.hive分区
- 5.外部表和内部表
1.hive介绍
1.1 什么是hive
Hive是基于Hadoop的一个数据仓库工具。可以将结构化的数据文件映射为一张表,并提供完整的sql查询功能,底层是将sql语句转换为MapReduce任务进行运行。
Hive提供了一系列的工具,可以用来进行数据提取、转化、加载(ETL Extract-Transform-Load ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制,本质上是一种大数据离线分析工具。
HQL - Hive通过类SQL的语法,来进行分布式的计算,HQL用起来和SQL非常的类似,Hive在执行的过程中会将HQL转换为MapReduce去执行,所以Hive其实是基于Hadoop的一种分布式计算框架,底层仍然是MapReduce。
1.2 hive的优缺点
优点:
学习成本低,只要会sql就能用hive
开发效率高,不需要编程,只需要写sql
模型简单,易于理解
针对海量数据的高性能查询和分析
HiveQL 灵活的可扩展性(Extendibility)
高扩展性(Scalability)和容错性
与 Hadoop 其他产品完全兼容
缺点:
不支持行级别的增删改
不支持完整的在线事务处理
本质上仍然是MR的执行,效率不算高
1.3 适用场景
Hive 构建在基于静态(离线)批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询因此,Hive 并不适合那些需要低延迟的应用
Hive 并不提供实时的查询和基于行级的数据更新操作,最佳使用场合是大数据集的离线批处理作业,例如,网络日志分析
2.hive基本操作
2.1 查数据库
show databases;
2.2 创建park数据库
create database park;
2.3 进入park数据库
use park;
2.4 查看表
show tables;
2.5 创建stu表
create table stu (id int,name string);
2.6 创建一个和表stu结构一样的stu2表
create table stu2 like stu;
2.7 向表stu插入数据(会产生临时表)
insert into stu values(1,‘zhang’);
2.8 查看表stu数据
select * from stu;
2.9 查看表stu结构
desc stu;
2.10 删除表stu
drop table stu; #
2.11 创建stu表,并指定分割符 空格
create table stu(id int,name string) row format delimited fields terminated by ’ ';
2.12 通过加载文件数据到指定的表stu里(写入的数据是递增的)
load data local inpath ‘/opt/software/1.txt’ into table stu;
2.13 把stu表数据插入到stu1表中
insert overwrite table stu1 select * from stu;
2.14 将stu表中查询的数据写到本地的/opt/stu目录下
insert overwrite local directory ‘/opt/stu’ row format delimited fields terminated by ’ ’ select * from stu;
2.15 将stu表中查询的数据写到HDFS的stu目录下
insert overwrite directory ‘/stu’ row format delimited fields terminated by ’ ’ select * from stu;
2.16 将stu表中查询的数据写到stu1以及stu2两张表中
from stu insert overwrite table stu1 select * insert overwrite table stu2 select *;
2.17 为表stu重命名为stu2
alter table stu rename to stu2;
2.18 为表stu增加一个列字段age,类型为int
alter table stu add columns (age int);
exit; #退出Hive
2.19 注意点
1.创建的数据库,实际是在Hadoop的HDFS文件系统里创建一个目录节点,统一存在: /user/hive/warehouse 目录下
2.hive里,表示字符串用的是string,不用char和varchar
3.所创建的表,也是HDFS里的一个目录节点
4.HDFS不支持数据的修改和删除,因此已经插入的数据不能够再进行任何的改动
5.insert into 语句执行的实际上是追加操作
6.Hive支持查询,行级别的插入。不支持行级别的删除和修改
7.Hive的操作实际是执行一个job任务,调用的是Hadoop的MR
8.插入完数据之后,发现HDFS stu目录节点下多了一个文件,文件里存了插入的数据,因此,hive存储的数据,是通过HDFS的文件来存储的
9.Hive的工作原理实际上就是在管理hdfs上的文件,把文件里数据抽象成二维表结构,然后提供hql语句供程序员查询文件数据
10.like只复制表结构,不复制数据
3.python连接hive
Pip3.7 install sasl
Pip3.7 install thrift
Pip3.7 install thrift-sasl
Pip3.7 install PyHive
[root@python python]# yum install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi -y
[root@python python]# cat hive.py
#!/usr/bin/python3.7 env
import sys
from pyhive import hive
conn=hive.Connection(host=‘192.168.3.10’,port=10000,username=‘uhadoop’,database=‘hive’)
cursor=conn.cursor()
cursor.execute(‘select * from poke01’)
for result in cursor.fetchall():
print(result)
4.hive分区
是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
实战
创建分区表
hive> create table partth(createdate string,value string) partitioned by (year string) row format delimited fields terminated by ‘\t’;
给表创建两个分区
hive> alter table partth add partition(year=‘2014’)
hive> alter table partth add partition(year=‘2015’);
hive> desc partth;
createdate string
value string
year string
向分区导入数据
hive>load data local inpath ‘/root/testsh/1.txt’ into table partth partition(year=‘2015’);
#这里文件的内容有多少显示多少。
hive> select * from partth where year=‘2015’;
hive> select count(*) from partth where year=‘2015’;
5.外部表和内部表
a.内部表和外部表概述
内部表:先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件方式来插入数据),这样的表称之为hive的内部表
外部表:HDFS里已经有数据了,然后,通过hive创建一张表来管理这个文件数据。则这样表称之为外部表。需要注意的是,hive外部表管理的是HDFS里的某一个目录下的文件数据
外部表创建命令:
hive> create external table stu (id int,name string) row format delimited fields terminated by ‘,’ location ‘/home/uhadoop/test/’;
b.内部表和外部表区别
对于内部表,在删除该表的时候,HDFS对应的目录节点会被删除
对于外部表,在删除该表的时候,HDFS对应的目录节点不会删除