# hive指南
hive是什么?
hive是基于hadoop构建的数据仓库基础架构,通过提供一系列的工具,使得用户能够方便的做数据ETL,数据结构化,并针对存放在hadoop上的海量数据进行查询和分析。
hive定义了一种简单的类SQL查询语言---QL,QL语言方便熟悉SQL语言的用户去查询数据。此外,hive也支持熟悉map-reduce的开发者使用map-reduce程序对数据做更加复杂的分析。
hive可以很好的结合thrift和控制分隔符,也支持用户自定义分隔符。
hive不是什么?
hive基于hadoop,hadoop是批处理系统,不能保存低延迟,因此,hive的查询也不能保证低延迟。
hive的工作模式是:提交一个任务,等到任务结束时被通知,而不是实时查询。相对应的是,类似于oracle这样的系统当运行于小数据集的时候,响应非常快,可当处理的数据集非常大的时候,可能需要数小时。需要说明的是,hive即使在很小的数据集上运行,也可能需要数分钟才能完成。
总之,低延迟不是hive追求的首要目标。hive的设计目标是:可伸缩、可扩展、容错及输入格式松耦合
**数据单元**
按照数据粒度大小,hadoop可以被组织成:
1\. databases: 避免不同表产生命名冲突的一种命名空间
2\. tables:具有相同scema的同质数据的集合
3\. partitions:一个表可以有一个或多个决定数据如何存储的partition key
4\. buckets(clusters):在同一个partition中的数据可以根据某个列的hash值分为多个bucket
partition和bucket并非必要,但是,它们能大大加快数据的查询速度
**数据类型**
简单类型:
TINYINT - 1 byte integer
SMALLINT - 2 byte integer
INT - 4 byte integer
BIGINT - 8 byte
BOOLEAN - TRUE/ FALSE
FLOAT - 单精度
DOUBLE - 双精度
STRING - 字符串集合
复杂类型:
Structs: structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a
Maps(K-V对):访问指定域可以通过["指定域名称"]进行,例如,一个Map M包含了一个group-》gid的kv对,gid的值可以通过M['group']来获取
Arrays:array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'
**语言能力**
hive查询语言提供基本的类sql操作,这些操作基于table和partition,包括:
1.使用where语句过滤制定行
2.使用select查找指定列
3.join两张table
4.group by
5\. 一个表的查询结果存入另一张表
6.将一个表的内容存入本地目录
7.将查询结果放在hdfs上
8.管理table和partition(creat、drop、alert)
9.在查询中嵌入map-reduce程序