关系数据库里有表(table),分区,hive里也有这些东西,这些东西在hive技术里称为hive的数据模型。今天本文介绍hive的数据类型,数据模型以及文件存储格式。这些知识大家可以类比关系数据库的相关知识。

  首先我要讲讲hive的数据类型。

Hive支持两种数据类型,一类叫原子数据类型,一类叫复杂数据类型。

  原子数据类型包括数值型、布尔型和字符串类型,具体如下表所示:

基本数据类型

类型

描述

示例

TINYINT

1个字节(8位)有符号整数

1

SMALLINT

2字节(16位)有符号整数

1

INT

4字节(32位)有符号整数

1

BIGINT

8字节(64位)有符号整数

1

FLOAT

4字节(32位)单精度浮点数

1.0

DOUBLE

8字节(64位)双精度浮点数

1.0

BOOLEAN

true/false

true

STRING

字符串

‘xia’,”xia”

  由上表我们看到hive不支持日期类型,在hive里日期都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作。

hive是用java开发的,hive里的基本数据类型和java的基本数据类型也是一一对应的,除了string类型。有符号的整数类型:TINYINT、SMALLINT、INT和BIGINT分别等价于java的byte、short、int和long原子类型,它们分别为1字节、2字节、4字节和8字节有符号整数。Hive的浮点数据类型FLOAT和DOUBLE,对应于java的基本类型float和double类型。而hive的BOOLEAN类型相当于java的基本数据类型boolean。

  对于hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

Hive支持基本类型的转换,低字节的基本类型可以转化为高字节的类型,例如TINYINT、SMALLINT、INT可以转化为FLOAT,而所有的整数类型、FLOAT以及STRING类型可以转化为DOUBLE类型,这些转化可以从java语言的类型转化考虑,因为hive就是用java编写的。当然也支持高字节类型转化为低字节类型,这就需要使用hive的自定义函数CAST了。

  复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下表所示:

复杂数据类型

类型

描述

示例

ARRAY

一组有序字段。字段的类型必须相同

Array(1,2)

MAP

一组无序的键/值对。键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同

Map(‘a’,1,’b’,2)

STRUCT

一组命名的字段。字段类型可以不同

Struct(‘a’,1,1,0)

下面我们看看hive使用复杂数据类型的实例,建表:

Create table complex(col1 ARRAY<INT>,

Col2 MAP<STRING,INT>,

Col3 STRUCT<a:STRING,b :INT,c:DOUBLE>);

查询语句:

Select col1[0],col2[‘b’],col3.c from complex;

  接下来我们来看看hive的数据模型,hive的数据模型包括:database、table、partition和bucket。下面我将一一论述这四种数据模型。

1.Database:相当于关系数据库里的命名空间(namespace),它的作用是将用户和数据库的应用隔离到不同的数据库或模式中,该模型在hive 0.6.0之后的版本支持,hive提供了create databasedbname、use dbname以及drop database dbname这样的语句。

2.表(table):hive的表逻辑上由存储的数据和描述表格中的数据形式的相关元数据组成。表存储的数据存放在分布式文件系统里,例如HDFS,元数据存储在关系数据库里,当我们创建一张hive的表,还没有为表加载数据的时候,该表在分布式文件系统,例如hdfs上就是一个文件夹(文件目录)。Hive里的表友两种类型一种叫托管表,这种表的数据文件存储在hive的数据仓库里,一种叫外部表,这种表的数据文件可以存放在hive数据仓库外部的分布式文件系统上,也可以放到hive数据仓库里(注意:hive的数据仓库也就是hdfs上的一个目录,这个目录是hive数据文件存储的默认路径,它可以在hive的配置文件里进行配置,最终也会存放到元数据库里)。

下面是创建托管表的实例语句:

Create table tuoguan_tbl (flied string);

Load data local inpath ‘home/hadoop/test.txt’ into table tuoguan_tbl;

外部表创建的实例:

Create external table external_tbl (flied string)

    Location  ‘/home/hadoop/external_table’;

Load data local inpath ‘home/hadoop/test.txt’ into table external_tbl;

  大家看到了创建外部表时候table之前要加关键字external,同时还要用location命令指定文件存储的路径,如果不使用locaction数据文件也会放置到hive的数据仓库里。

  这两种表在使用的区别主drop命令上,drop是hive删除表的命令,托管表执行drop命令的时候,会删除元数据和存储的数据,而外部表执行drop命令时候只删除元数据库里的数据,而不会删除存储的数据。另外我还要谈谈表的load命令,hive加载数据时候不会对元数据进行任何检查,只是简单的移动文件的位置,如果源文件格式不正确,也只有在做查询操作时候才能发现,那个时候错误格式的字段会以NULL来显示。

3.分区(partition):hive里分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在hive存储上就体现在表的主目录(hive的表实际显示就是一个文件夹)下的一个子目录,这个文件夹的名字就是我们定义的分区列的名字,没有实际操作经验的人可能会认为分区列是表的某个字段,其实不是这样,分区列不是表里的某个字段,而是独立的列,我们根据这个列存储表的里的数据文件。使用分区是为了加快数据分区的查询速度而设计的,我们在查询某个具体分区列里的数据时候没必要进行全表扫描。下面我就举一个分区使用的实例:

创建分区:

Create table logs(ts bigint,line string)

Partitioned by (dt string,country string);

加载数据:

Local data local inpath ‘/home/hadoop/par/file01.txt’ into table logs partition (dt=’2012-06-02’,country=’cn’);

在hive数据仓库里实际存储的路径如下所示:

/user/hive/warehouse/logs/dt=2013-06-02/country=cn/file1.txt

/user/hive/warehouse/logs/dt=2013-06-02/country=cn/file2.txt

/user/hive/warehouse/logs/dt=2013-06-02/country=us/file3.txt

/user/hive/warehouse/logs/dt=2013-06-02/country=us/file4.txt

我们看到在表logs的目录下有了两层子目录dt=2013-06-02和country=cn

查询操作:

Select ts,dt,line  from logs where country=’cn’,

这个时候我们的查询操作只会扫描file1.txt和file2.txt文件。

4.桶(bucket):上面的table和partition都是目录级别的拆分数据,bucket则是对数据源数据文件本身来拆分数据。使用桶的表会将源数据文件按一定规律拆分成多个文件,要使用bucket,我们首先要打开hive对桶的控制,命令如下:

set hive.enforce.bucketing = true

示例:

建临时表student_tmp,并导入数据:

hive> desc student_tmp;        

OK

id      int

age     int

name    string

stat_date       string

Time taken: 0.106 seconds

hive> select * from student_tmp;

OK

1       20      zxm     20120801

2       21      ljz     20120801

3       19      cds     20120801

4       18      mac     20120801

5       22      android 20120801

6       23      symbian 20120801

7       25      wp      20120801

Time taken: 0.123 seconds

建student表:

hive>create table student(id INT, age INT, name STRING)

       >partitioned by(stat_date STRING)

       >clustered by(id) sorted by(age) into 2 buckets

       >row format delimited fields terminated by ',';

设置环境变量:

       >set hive.enforce.bucketing = true;

插入数据:

       >from student_tmp

       >insert overwrite table student partition(stat_date="20120802")

       >select id,age,name where stat_date="20120801" sort by age;

查看文件目录:

$ hadoop fs -ls /user/hive/warehouse/studentstat_date=20120802/

Found 2 items

-rw-r--r--   1 work supergroup         31 2012-07-31 19:52 /user/hive/warehouse/student/stat_date=20120802/000000_0

-rw-r--r--   1 work supergroup         39 2012-07-31 19:52 /user/hive/warehouse/student/stat_date=20120802/000001_0

  物理上,每个桶就是表(或分区)目录里的一个文件,桶文件是按指定字段值进行hash,然后除以桶的个数例如上面例子2,最后去结果余数,因为整数的hash值就是整数本身,上面例子里,字段hash后的值还是字段本身,所以2的余数只有两个0和1,所以我们看到产生文件的后缀是*0_0和*1_0,文件里存储对应计算出来的元数据。

Hive的桶,我个人认为没有特别的场景或者是特别的查询,我们可以没有必要使用,也就是不用开启hive的桶的配置。因为桶运用的场景有限,一个是做map连接的运算,我在后面的文章里会讲到,一个就是取样操作了,下面还是引用风生水起博文里的例子:

查看sampling数据:

hive> select * from student tablesample(bucket 1 out of 2 on id);                                                                              

Total MapReduce jobs = 1

Launching Job 1 out of 1

.......

OK

4       18      mac     20120802

2       21      ljz     20120802

6       23      symbian 20120802

Time taken: 20.608 seconds

tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取 (64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例 如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。

hive数据类型有哪些?相关推荐

  1. hive mysql类型,(二)Hive数据类型、数据定义、数据操作和查询

    1.数据类型 1.1 基本数据类型Hive数据类型长度例子TINYINT1byte有符号整数20 SMALINT2byte有符号整数20 INT4byte有符号整数20 BIGINT8byte有符号整 ...

  2. Hive——Hive数据类型

    1.基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 INT int 4byt ...

  3. hive 数据类型 java_Hive数据类型

    第3章Hive数据类型 3.1基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 ...

  4. 谈笑间学会大数据-Hive数据类型和文件格式

    Hive数据类型和文件格式 目录 Hive数据类型和文件格式 Hive数据类型 数据类型的意义 hive基本数据类型 集合数据类型 文本文件数据编码 读时模式 hive存储格式类型 Hive数据类型 ...

  5. Hive数据类型、数据库相关操作、表的相关操做、数据的导入导出

    文章目录 Hive数据类型 1.基本数据类型 2.集合数据类型 案例实操 3.类型转化 数据库的相关操作 1.创建数据库 2.查询数据库 3.修改数据库 4.删除数据库 表的相关操作 1.建表 2.管 ...

  6. Hive数据类型和使用注意事项详解

    了解Hive数据类型 ,是Hive编程的基础.使用hive建表,首先要明白hive常用的数据类型有哪些,可以存储哪些类型的数据.其实Hive支持关系型数据库中的大多数基本数据类型,且同时支持关系型数据 ...

  7. Hive数据类型汇总

    目录 1 背景介绍 2 Hive数据类型 2.1 基本数据类型 2.2 集合数据类型 2.3 类型转换 3 总结 1 背景介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储(HDFS)和 ...

  8. hive数据类型及转换

    1 hive 数据类型 1.1 基本数据类型 对于 Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以 ...

  9. Hive数据类型类型转换

    1. 基本数据类型 Hive数据类型 Java 数据类型 长度 例子 TINYINT byte 1byte 有符号整数 20 SMALINT short 2byte 有符号整数 20 INT int ...

  10. hive —— 数据类型

    hive -- 数据类型 详细请看 hive官方手册:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#Lan ...

最新文章

  1. 队列在多线程中的应用
  2. java之redis篇(spring-data-redis整合)
  3. Asp.Net Core 快速邮件队列设计与实现
  4. 树的基本操作代码 c语言,二叉树的基本操作(C语言、源代码)
  5. [Matlab] 传入 dsolve 的方程组必须是行向量才能求解
  6. mybatis parameterType
  7. using namespace cocos2d;
  8. Trait这个类的特性
  9. ubuntu vscode 配置字体_配置vscode终端字体,vscode终端字体
  10. 基于javaweb+springboot的学生学科竞赛管理管理系统设计和实现(java+springboot+ssm+maven)
  11. 模式识别、机器学习的区别和联系
  12. 质疑 追寻 与成果出版——读戴德金1872年《连续性和无理数》之1
  13. linux上安装NVIDIA显卡驱动以及深度学习需要的cudn、cudnn、pytorch
  14. 一个小蜜蜂游戏的源代码
  15. golang的ping检测网络实现
  16. 群友转发了一段家庭矛盾的视频
  17. java月份简写_Java如何以(MMM)格式显示一个月份的名称?
  18. 数据流—DataStreamAPI
  19. easyrecovery15中文版一键批量恢复数据软件
  20. 字符串长度计算(包含中文)

热门文章

  1. sizeof计算二维数组的大小
  2. pytorch KL散度学习
  3. vue跳转后不记录历史记录
  4. 浏览器如何在f12中查看接口地址_使用IE浏览器F12开发人员工具提取下载视频地址...
  5. A,B,C类基金我们应该怎么买
  6. LTE网络弱覆盖影响下载速率案例-(陆东明)
  7. GIS其实就在我们身边
  8. [ROS] rviz 可视化工具
  9. Proxy代理construct方法
  10. Canvas实践教程