分区表

 

在Hive Select查询中,一般会扫描整个表内容(HDFS上文件的内容),会消耗很多时间做没必要的工作。分区表指的是在创建表时,指定partition的分区空间。

 

庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。

 

数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。最好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。

 

  Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。

 

  Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。

 

 

 

分区表的语法:

 

create table tablename

name string

)

partitioned by(key type,…)

 

示例:

 

create table if not exists employees(

name string,

salary string,

subordinates array<string>,

deductions map<string,float>,

address struct<street:string,city:string,state:string,zip:int>

)

partitioned by (dt string,type string) //制定分区

row format delimited fields terminated by '\t' //指定字段分隔符为tab

collection items terminated by ',' //指定数组中字段分隔符为逗号

map keys terminated by ':' //指定字典中KV分隔符为冒号

lines terminated by '\n' //指定行分隔符为回车换行

stored as textfile //指定存储类型为文件

;

 

查看刚才建立的分区

SHOW PARTITIONS employees;

 

 

 

 

a ... .. |.. . . . .. . a100

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

 

create table 弱天气 (id 天气类型 类型规范 气象数据 。。。。。。。 ); -----/usr/hive/warehouse/弱天气

part....... 雨 /usr/hive/warehouse/rain

part....... 雪 (1 雪 10020 30mm/h ............) /usr/hive/warehouse/snow

part....... 风 /usr/hive/warehouse/wind

part....... 霜 /usr/hive/warehouse/shuang

part....... 雷电 /usr/hive/warehouse/light

part....... 雾 /usr/hive/warehouse/wu

part....... 霾 /usr/hive/warehouse/mai

 

1 雪 10020 30mm/h ............

2 雨 10019 60mm/h ............

 

range

 

 

oltp 联机在线事务处理系统

olap 联机在线决策支持系统

dss/dw 离线或非联机决策支持系统

 

所谓数据仓库指的就是所存储数据经过特殊处理(ETL)后汇总到某一容器中,以供决策支持调用。

 

 

 

create table people (id char(18),name varchar(100),sex char(4),birthday date);

partitioned by (local string)

 

13亿数据中找到所有的吉林人

 

 

select * from people where local='吉林';

 

如果在不分区的情况下我需要到13亿条数据中逐条寻找吉林的数据

 

如果在分区的情况下 我只需要到local下的吉林区间里去找就可以了 大大的缩小了查询范围