hive笔记1

目录

1.hive的定义:

2.hive的工作机制

3.hive表与普通表的区别

4.hive的存储结构

5. HQL语句 


为什么要引入hive呢?

通常我们使用的数据库是mysql,但是接触大数据领域以后存储空间就不太够用,所以开始用hdfs存储数据,简单来说hive是通过mysql来管理hdfs上的数据。

1.hive的定义:

Hive 是建立在 Hadoop  上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop  中的大规模数据的机制。Hive 定义了简单的类 SQL  查询语言,称为 HQL ,它允许熟悉 SQL  的用户查询数据。同时,这个语言也允许熟悉 MapReduce  开发者的开发自定义的 mapper  和 reducer  来处理内建的 mapper 和 reducer  无法完成的复杂的分析工作。

2.hive的工作机制

Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行

Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据

Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上

3.hive表与普通表的区别

1. 查询语言。类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。

2. 数据存储位置。所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

3. 数据格式。Hive 中没有定义专门的数据格式。而在数据库中,所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。

4. 数据更新。Hive 对数据的改写和添加比较弱化,0.14版本之后支持,需要启动配置项。而数据库中的数据通常是需要经常进行修改的。

5. 索引。Hive 在加载数据的过程中不会对数据进行任何处理。因此访问延迟较高。数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

6. 执行计算。Hive 中执行是通过  MapReduce 来实现的而数据库通常有自己的执行引擎。

7. 数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小 

4.hive的存储结构

 TextFile:默认的存储格式,此种格式的表文件在HDFS上是明文,可用hadoop fs -cat命令查看,从HDFS上get下来后也可以直接读取。

RCFile:是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。比TextFile快不到哪里去。

ORCFile:有着很高的压缩比,可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升,由于压缩的问题,cat和select操作是无法查看到里面的内容的

Parquet:   这是用来存储结构化数据,但是不支持update操作

(SequenceFile:  他是Hadoop API 提供的一种二进制文件,优点就是Hadoop原生支持较好,实际不会使用

Avro:是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。)

5. HQL语句 

比较长的hql语句或者里面含有中文字段的话,最好在window文本中编辑好再复制进hive中,不然有时候就会莫名报错

//显示所有数据库
hive> show databases;

创建和删除数据库 

//创建database
hive> create database if not exists test;
//删除空的数据库,但是如果不是空的会报错
hive> drop database test;
//不为空的数据库可以通过这个方式删除掉
hive> drop database test cascade;

查询数据库信息 

//查询数据库的信息
hive> desc database test;
//查询数据库详细信息
hive> desc database extended test;

创建表:分为内部表和外部表

这2者这有什么区别呢?内部表与数据做了绑定,

 内部表删除了表,数据就会全部消失,也就是常说的删库跑路,

外部表与数据文件做的绑定,即使你删除了表,文件目录,数据文件还是在原位置上不会改变。

//创建内部表,这是一个最常见的语句,
最后一句ROW...是规定每个字段用','隔开,我们在文件中读取数据就是按','分割的
CREATE TABLE students(
  id bigint , 
  name string , 
  age int, 
  gender string, 
  clazz string )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
//创建外部表,就是加了一个external
CREATE external TABLE students(
  id bigint , 
  name string , 
  age int, 
  gender string, 
  clazz string )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

 指定表的位置:

create external table students (
id string,
name string,
age string,
gender string,
clazz string
)
row format delimited fields terminated by ','
location '/testdata/'; 
//非必选;指定文件在hdfs上的存储路径,如果已经有文件,会自动加载 ,默认在hive的warehouse下

删除表

hive> truncate table students;

查询表结构

//查询表结构
hive> desc students;
//查询详细的表结构
hive> desc formatted students;

插入语句:这里运行后,会出现mapreduce的运行日志,证明了上面说hive是将SQL语句转译成M/R Job然后在Hadoop执行,所以非常慢

hive> insert into students values (1001,zs,18,male,一班);

 所以可以将存储数据的文件传输到hdfs中对应hive表下的位置

建表时没有指定输出位置的表位置:默认在/user/hive/warethouse/使用的数据库下

 上传数据有四种方式:

1.直接hdfs上传文件

//hadoop dfs -put 本地文件路径 hdfs文件路径
[root@master module]# hadoop dfs -put students.txt /user/hive/warehouse/test1.db/students

2.hive中执行hdfs的上传命令

但是执行命令的速度比上面的要快

//dfs -put 本地文件路径 hdfs文件路径 
hive> dfs -put /usr/local/module/students.txt /user/hive/warehouse/test1.db/students

3.从本地加载数据到hdfs

//load data local inpath '文件本地存储路径' into table 表名
hive> load data local inpath ' /usr/local/module/students.txt' into table students;

4.hdfs上加载数据

对于hdfs是一个加载数据的操作,但是hdfs将文件直接移动到了对应的表文件夹下

//load data inpath 'hdfs上的文件路径' into table 目标表名
hive> load data inpath ' /data/students.txt' into table students;

5.insert into  向表中插入数据 ,上面的都是从文间中加载数据,而这里是直接将数据导入

所以就会又一个好处,我的数据来源是text格式,如果目标表的存储格式是其他的,比如:rcf

上面的4种方式是无法处理的,因为格式不匹配,但是使用insert 就会将数据类型自动转换

//insert [overwrite] into 目标表名 数据来源
hive> insert into studentText select * from students;

可以看到这个插入数据的过程是通过mapreduce完成的 

 6.创建表就加载数据,但是这种方式不可以加入其他语句,例如指定存储格式,分区信息等

//创建的是内部表
//create table  表名 as 查询语句
create table studenttest as  select * from students;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值