2023-02-09
數據 查詢 分區
Hive表在創建的時候,其實就是在HDFS的指定目錄上創建的一個文件夾。如果是內部表,只能映射在數據庫目錄下,而如果是外部表,則可以使用location指定映射的位置。這個文件夾下的所有的數據文件,都是這個表中的數據。隨著系統運行時間的累積,文件中的數據量也會越來越大。hive在進行查詢的時候,每一次的查詢,都會從這個目錄下的所有的數據文件中進行查詢。如果數據量過大的時候,這個查詢將會非常的慢了。
那么,有沒有什么辦法可以加速這個查詢的過程呢?其實,最簡單的加速查詢就是減少文件的掃描量即可。
我們以一個電商的訂單數據表為例,表中存放著過去5年的所有的訂單數據。每一次查詢的時候,都需要從所有的數據文件中進行查詢,數據量非常龐大,導致查詢的時間會非常的長。但是,表中的5年的訂單的數據,我們在查詢的時候,很多的數據其實都是沒有必要去查詢的。其中沒有任何的數據價值,反而要增加查詢的文件數量。
如果我們對這些訂單的數據分個類呢?例如,按照時間?
我們可以在表目錄下創建若干個文件夾,例如: 2022年、2021年、2020年...,然后將不同年份的訂單數據,存放到對應的文件夾里面即可。這樣我們在進行數據查詢的時候,如果要查詢2022年的數據,是不是只需要到2022年的文件夾中查詢即可,不用再查詢所有的數據了,就達到了加速查詢的效果了!
這,就是分區!
我們使用分區,就是將表中的數據,按照不同的維度進行歸類。在進行數據查詢的時候,就可以按照不同的分區的號,到指定的文件夾中進行查詢即可。在上述的例子中,表目錄下只創建了一層的文件夾,這就是一級分區。而有時候我們還需要在一個文件夾中創建二級文件夾,來將數據進行更加細致的歸類,例如對于某一年的數據,可以按照月份再進行歸類。這就是二級分區。在創建分區的時候,還可以創建三級、四級等分區,但是實際使用中,三級分區已經是比較多的分區層級了。常用的就是一級和二級分區。
分區表在創建的時候,需要使用partitioned by 來指定分區的字段。例如:
12345
create table tableName(
.......
.......
)
partitioned by (colName colType [comment '...'],...)
需要注意的是,分區字段是一個偽字段,并不會真實的存儲數據,只是一個分區的標識而已。例如我們在建表的時候如下:
-- 一級分區
create table part1(
id int,
name string,
age int
)
partitioned by (dt string)
row format delimited
fields terminated by ',';
-- 二級分區
create table part2(
id int,
name string,
age int
)
partitioned by (year int, month int)
row format delimited
fields terminated by ',';
在上述的兩個分區表中,dt字段、year字段、month字段等,都是分區字段。如果我們到數據文件中進行數據的查看的話,你會發現數據文件中其實并沒有這個字段對應的信息。但是我們的確是可以通過desc查看表結構,能夠看到這個字段。因此這個字段存在的意義,只是用來區分分區的,而并不是真實的用來映射數據的。因此我們稱這樣的字段為偽字段。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號