Hive分区表
分区表
在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下的吉林区间里去找就可以了 大大的缩小了查询范围