`

大数据时代的技术hive:hive的数据类型和数据模型

 
阅读更多

在上篇文章里,我列举了一个简单的hive操作实例,创建了一张表test,并且向这张表加载了数据,这些操作和关系数据库操作类似,我们常把hive和关系数据库进行比较,也正是因为hive很多知识点和关系数据库类似。

  关系数据库里有表(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 database dbname、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 bucket
       >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的数据。

  

分享到:
评论

相关推荐

    大数据时代银行业的机遇与挑战.docx

    这些非结构化数据的产生往往伴随着社交网络、移动计算、传感器等新兴渠道和技术的不断涌现和应用。企业用以分析的数据越全面,分析的结果就越接近于真实。大数据分析意味着企业能够从这些新的数据中获取新的洞察力,...

    数据分析方法与技术.pptx

    Volume 海量的数据规模 Variety 多样的数据类型 Value Velocity 快速的数据流转 发现数据价值 要解决的问题 大数据技术被设计用于在成本可承受的条件下,通过非常快速(velocity)地采集、发现和分析,从大量...

    价值上万的视频教程互联网程序开发+大数据+Hadoop、hive、Spark

    lg大数据高薪训练营 HBase、 Java9 、Java10 、MySQL优化 、JVM原理 、JUC多线程、 CDH版Hadoop Impala、 Flume 、Sqoop、 Azkaban、 Oozie、 HUE、 Kettle、 Kylin 、Spark 、Mllib机器学习、 Flink、 Python、 ...

    大数据概述——精选推荐.pdf

    2)存储设备容量不断增加,cpu处理能⼒⼤幅度提升,⽹络带宽不断增加为⼤数据时代提供技术⽀持。 3)数据产⽣⽅式从1.运营式阶段&gt;2.⽤户原创内容阶段&gt;3.感知式阶段 的变⾰促成了⼤数据时代的到来。 4)⼤数据发展...

    大数据之运维.pptx

    Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。 支持索引,加快数据...

    大数据基础知识入门.pdf

    麦肯锡全球研究所给出的定义是:一 种规模大到在获取、存储、管理、分 析方面大大超出了传统数据库软件工 具能力范围的数据集合,具有海量的 数据规模、快速的数据流转、多样的 数据类型和价值密度低四大特征。...

    大数据-sqoop.pptx

    缺点比较: Sqoop1的缺点——命令行方式容易出错,格式紧耦合,无法支持所有数据类型,安全机制不够完善,例如密码暴漏, 安装需要root权限,connector必须符合JDBC模型 。 Sqoop2的缺点——架构稍复杂,配置部署...

    基于Hadoop豆瓣电影数据分析实验报告

    针对本次实验,我们需要用到Hadoop集群作为模拟大数据的分析软件,集群环境必须要包括,hdfs,hbase,hive,flume,sqoop等插件,最后结合分析出来的数据进行可视化展示,需要用到Python(爬取数据集,可视化展示)...

    百度云盘 pdf《大数据架构和算法实现之路:电商系统的技术实战》百度云盘-带标签目录

    第 1 章方案设计和技术选型:分类 ·5 1.1 分类的基本概念…...... .…………….. 6 1.2 分类任务的处理流程 ……·· ……·7 1.3 算法:朴素贝叶斯和 K最近邻……·8 1.3.1 朴素贝叶斯….......……… …….. 8 ...

    大数据中台架构栈.doc

    近来数据中台概念大火,大家对它的定义也五花八门,...目前业界最知名的就是 Apache 基金会名下的 Hadoop 系统,它根本可以作为大数据时代存储计算的经典模型。 HDFS HDFS 作为 Hadoop 里的分布式文件系统,为 HBase

    data-generator:如果你在从事大数据BI的工作,想对比一下MySQL、GreenPlum、Elasticsearch、Hive、Spark SQL、Presto、Impala、Drill、HAWQ、Druid、Pinot、Kylin、ClickHouse、Kudu等不同实现方案之间的表现,那你就需要一份标准的数据进行测试,这个开源项目就是为了生成这样的标准数据

    数据生成器如果你在从事大数据BI的工作,想对比一下MySQL、GreenPlum、Elasticsearch、Hive、Spark SQL、Presto、Impala、Drill、HAWQ、Druid、Pinot、Kylin、ClickHouse、Kudu等不同实现方案之间的表现,那你就需要...

    大数据学习计划.pdf

    HDFS(对于本⽂)的上⼀层是MapReduce 引 擎,通过对Hadoop分布式计算平台最核⼼的分布式⽂件系统HDFS、MapReduce处理过程,以及数据仓库⼯具Hive和分布式数据库Hbase 的介绍,基本涵盖了Hadoop分布式平台的所有技术核...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    11.1.4 数据类型 11.1.5 操作符和函数 11.1.6 交互式和非交互式的Pig 11.2 使用Pig 在日志数据中发现恶意行为者 11.2.1 加载数据 技术点67 加载Apache 日志文件 11.2.2 过滤和投影 技术点68 ...

    Hadoop实战(第2版)

    10.2.1 序列化和反序列化技术点64 载入日志文件10.2.2 UDF、分区、分桶和压缩技术点65 编写UDF 和压缩分区表10.2.3 数据合并技术点66 优化Hive 合并10.2.4 分组、排序和explain 10.3 本章小结11 ...

    现代物流大数据分析大作业《网站用户行为分析》

    用户行为分析是对用户在产品上的产生的行为及行为背后的数据进行分析,通过构建用户行为模型和用户画像,来改变产品决策,实现精细化运营,指导业务增长。该数据来源于网站用户购物行为数据集的2000万条记录。此案列...

    大数据分析与应用期末考试.docx

    [单选题] * A、数据规模大(正确答案) B、数据类型多样 C、数据处理速度快 D、数据价值密度高 18、下列关于舍恩伯格对大数据特点的说法中,错误的是()。 [单选题] * A、数据规模大 B、数据类型多样 C、数据处理...

    Hadoop权威指南(中文版)2015上传.rar

    1.5.1 数据类型 1.5.2 操作和函数 1.6 表 1.6.1 托管表(Managed Tables)和外部表(External Tables) 1.6.2 分区(Partitions)和桶(Buckets) 1.6.3 存储格式 1.6.4 导入数据 1.6.5 表的修改 1.6.6 表的丢弃 1.7...

Global site tag (gtag.js) - Google Analytics