Hive学习(上)

1Hive概念

1.1 Hive架构

在这里插入图片描述

  • 1.用户接口:Client(与Hive交互)

CLI(Hive shell)、JDBC/ODBC(基于 JDBC 操作提供的客户端)、WEBUI(浏览器访问Hive,例如:Cloudera提供的开源Hue项目、Qubole提供的Hive即服务方式、Karmasphere发布的商业化产品等)

  • 2.跨语言服务:Thrift Server

    提供JDBC/ODBC接入的能力,用于进行可扩展且跨语言服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive接口

  • 3.元数据:MetaStore

所有的Hive客户端需要一个metastoreservice(元数据服务),Hive使用这个服务来存储表模式信息和其他元数据信息。

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否为外部表)、表所在的目录。

默认存储在自带的derby数据库中,缺点是不适合多用户操作,并且数据存储目录不固定。

推荐使用MySQL存储Metastore,Hive和Mysql之间通过MetaStore服务交互

可以在Mysql中查看DBS

  • 4.驱动器:Driver

    • 解析器(SQL Parser):将HiveQL语句转换为抽象语法树(AST)

    • 编译器(Physical Plan):将AST编译生成逻辑执行计划

    • 优化器(Query Optimizer):对逻辑执行计划进行优化

    • 执行器(Execution):将逻辑执行计划转换成可以运行的物理计划,例如MapReduce等。

      完成HQL的查询语句的词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,由MapReduce调用执行。

  • 5.Hadoop&MapReduce

使用HDFS进行存储,利用MapReduce进行计算。

  • 6.Hive数据组织

    • Hive的存储结构包括数据库视图分区表数据等。数据库,表,分区都对应HDFS上的一个目录,表数据对应HDFS对应目录下的文件。表数据对应HDFS对应目录下的文件。

    • Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式(Schema On Read),可支持TextFile,SequenceFile,RCFile或者自定义格式等。

    • Hive中包含以下数据模型:

      database:在HDFS中表现为${/user/hive/warehouse}目录下一个文件夹
      在这里插入图片描述
      table:在HDFS中表现为所属database目录下一个文件夹
      在这里插入图片描述

      external table:与table类似,但是其数据存放位置可以指定任意HDFS目录路径

      partition:在HDFS中表现为table目录下的子目录

在这里插入图片描述

**bucket**:在HDFS中表现为同一个表目录或者分区目录下根据某个字段值进行hash散列之后的多个文件

**view**:与传统数据库类似,只读,基于基本表创建。
  • Hive中的表分为内部表、外部表、分区表和Bucket表

    内部表与外部表的区别

    删除内部表,则会删除表元数据和数据

    删除外部表,则只会删除元数据,不会删除数据

    内部表和外部表的使用选择

    当只需要处理hive中的数据时,则倾向于选择内部表;

    当需要处理存储在HSFS上hive目录之外的数据时,则需要选择外部表,从而通过Hive转换数据并存入内部表中

    分区表与分桶表的区别

    Hive数据表可以根据某些字段进行分区操作,细化数据管理,让部分查询更快。

    表和分区可以进一步划分为Buckets,分桶表的原理和MapReduce编程中的HashPartitioner原理类似。

    分区和分桶都是细化数据管理,分区表是手动添加分区。由于Hive是只读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行Hash散列形成的多个文件,所以数据的准确性也提高很多。

1.2 Hive与数据库的比较

Hive采用了类似SQL的查询语言HQL,因此很容易将Hive理解为数据库。但是Hive除了和数据库拥有类似的查询语言,其他并没有相似之处。

1.2.1 查询语言

HQL类似于SQL,可以很方便的利用SQL进行开发

1.2.2 数据存储位置

Hive 是建立在Hadoop之上的,Hive中的数据都是存储在HDFS中的,而数据库可以将数据存储在块设备或者本地文件系统中。

1.2.3 数据更新

Hive是针对数据仓库应用设计的,而数据仓库是读多写少的,因此Hive中不建议对数据进行改写,所有数据都是在加载时确定好的

1.2.4 索引

Hive没有索引,所以访问延迟比较高,使得Hive不适合在线数据查询

针对大数据量的访问,由于引入了MapReduce,使得Hive可以并行访问数据,因此即使没有索引,Hive仍然具有优势。

1.2.5 执行

Hive中查询都是通过Hadoop提供的MapReduce来实现的,而数据库通常有自己的执行引擎

1.2.6 可扩展性

由于Hive是建立在Hadoop之上的,Hive的可扩展性和Hadoop的可扩展性是一致的。而数据库由于ACID语义严格限制,扩展行非常有限。

2.Hive数据类型

2.1 基本数据类型

Hive 数据类型 Java数据类型 长度 例子
TINYINT byte 1byte 有符号整数 20
SMALINT short 2 byte 有符号整数 20
INT int 4 byte 有符号整数 20
BIGINT long 8 byte 有符号整数 20
BOOLEAN boolean 布尔类型,true或者false TRUE FALSE
FLOAT float 单精度浮点数 3.14159
DOUBLE double 双精度浮点数 3.14159
STRING string 字符系列 ‘now is the time’
TIMESTAMP 时间类型
BINARY 字节数组

2.2 集合数据类型

数据类型 描述 语法示例
STRUCT 某个列的数据类型是STRUCT{first STRING,last STRING};访问第一个元素可以通过字段.first来引用 struct(‘John’,‘Doe’)
MAP 键值对元组集合:‘first’->‘john’和’last’->‘Doe’;可以通过字段名[‘last’]获取最后一个元素 map(first’,‘John’,‘last’,‘Doe’)
ARRAY 数组值为[‘John’,‘Doe’],第二个元素可以通过数组名[1]进行引用 Array(‘John’,‘Doe’)

Hive三种复杂数据类型ARRAY、MAP和STRUCT。ARRAY、MAP与Java中的Array和Map类似;

STRUCT与C语言中的Struct类似,封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

  • 实例操作

    1.例如某表有如下一行,利用JSON格式表示其数据结构

  {
   
   
      "name":"songsong"
      "friends":["bingbing","lili"]    //列表 Array
      "children":{
   
   				   //键值 Map
          "xiao song":18,
          "xiaoxiao song":19
      }
  	"address":{
   
   					  //结构 struct
          "street":"hui long guan"
          "city":"beijing"
      }
  }

2.基于上述数据结构,在Hive里创建对应的表,并导入数据

创建本地测试文件

songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

Hive 上创建测试表

CREATE TABLE test(
name string,
friends ARRAY<string>,
children map<string,int>,
address STRUCT<street:string,city:string>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';

将文本数据导入到测试表

hive> load data local inpath '/opt/datas/test.txt' into table test

访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT等数据结构的访问方式

SELECT friends[1], children['xiao song'], address.city from test where name="songsong";

2.3 类型转化

Hive 不会进行类型自动转化,除非使用CAST操作

  • 隐式类型转换规则如下

    任何整数类型都可以隐式地转换为一个范围更广的类型,TINYINT可以转换INT,INT转换为BIGINT。

    所有整数类型、FLOAT和STRING类型可以隐士地转换成DOUBLE

    TINYINT、SMALLINT、INT都可以转换为FLOAT

    BOOLEAN类型不可以转换为任何其他的类型

  • 可以使用CAST操作显示进行数据类型转换

    CAST(‘1’ AS INT)将把字符串’1’转换成整数1;强制类型转换失败,执行CAST(‘X’ AS INT),表达式返回空值NULL。

3.DDL数据定义

3.1 创建数据库

创建一个数据库

create database  if not exists db_hive;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值