hive分割槽的作用
如果沒有分割槽的存在,那麼每次查詢hive將會進行全表掃瞄。對於小資料量的表來說,全表掃瞄並不會慢到無法忍受,但是對於大資料量來講,比如幾年的資料,每次查詢都要掃瞄幾年的所有資料,除了浪費時間之外,還浪費集群資源。為了改進這一問題,分割槽的價值就體現出來了。對於幾年的資料,在設計hive表的時候,可以將時間設計為分割槽字段,至於時間維度細到怎樣的顆粒度,以業務需求為準。就這樣,分割槽的存在,極大的縮小了資料的查詢範圍,比如以天為單位的分割槽字段,在查詢2023年3月份的相關資料時,只需限制分割槽欄位的時間在2020-03-01~2020-03-31之間,hive就會根據分割槽字段條件直接找到幾年資料中歸屬2023年3月份的資料,然後在對2023年3月份的資料根據具體的邏輯進行處理即可,而不需要幾年的資料全部都掃瞄一次。
不難看出,hive分割槽,主要是以縮小資料查詢範圍,提高查詢速度和效能的。
hive靜態分割槽
hive的靜態分割槽,實際上就是手動指定分割槽的值為靜態值,這種對於小批量的分割槽插入比較友好,來看看靜態分割槽的hql
insert overwrite table demo_static_partition
partition(year="2020", month="04",
day="2020-04-10", hour="22")
select user_id, user_name,
trade_year as year ,
trade_month as month,
trade_day as day,
trade_hour as hour
from user_demo
where trade_year="2020"
and trade_month="04"
and trade_day="2020-04-10"
and trade_hour="22"
語句中partition(year=「2020」, month=「04」, day=「2020-04-10」, hour=「22」) 的年月日小時手動指定了具體的值,這樣的分割槽就叫靜態分割槽了,是不是很簡單?
hive動態分割槽
hive的動態分割槽,其實就是把靜態分割槽中的分割槽值設定為動態的值,就可以了,來看看動態分割槽相關的hql
insert overwrite table demo_dynamic_partition
partition(year=year, month=month,
day=day, hour=hour)
select user_id, user_name,
trade_year as year ,
trade_month as month,
trade_day as day,
trade_hour as hour
from user_demo
語句中partition(year=year, month=month, day=day, hour=hour)會根據具體值的變化而變化,無需手動指定,這對於大批量的分割槽插入是乙個很方便的用法,但需要根據業務需求衡量分割槽數量是否合理的問題。畢竟分割槽會占用io資源,數量越多,io資源消耗越大,查詢時間和效能都是有所損耗的。
在建立動態分割槽時,經常遇到自動插入分割槽失敗的問題,通過日誌分析,可以知道,一種是沒有開啟動態分割槽模式,一種是嚴格模式導致的動態分割槽插入失敗,一種是預設分割槽數量不足導致的分割槽插入失敗。我們來了解一下,與動態分割槽相關的一些引數,以便更好的使用。
-- hive預設配置值
-- 開啟或關閉動態分割槽
hive.exec.dynamic.partition=false;
-- 設定為nonstrict模式,讓所有分割槽都動態配置,否則至少需要指定乙個分割槽值
hive.exec.dynamic.partition.mode=strict;
hive.exec.max.dynamic.partitions.pernode=100;
-- 一條帶有動態分割槽sql語句所能建立的最大動態分割槽總數,超過則報錯
hive.exec.max.dynamic.partitions=1000;
-- 全域性能被建立檔案數目的最大值,通過hadoop計數器跟蹤,若超過則報錯
hive.exec.max.created.files=100000;
-- 根據個人需要配置
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.created.files=1000000;
hive靜態分割槽和動態分割槽結合使用當你想每天執行某個時間段的分割槽資料插入,可以考慮一下動靜分割槽結合方式,來看看hql如何寫?
insert overwrite table demo_static_partition
partition(year="2020", month="04",
day=day, hour=hour)
select user_id, user_name,
trade_year as year ,
trade_month as month,
trade_day as day,
trade_hour as hour
from user_demo
where trade_year="2020"
and trade_month="04"
db2 最大分割槽數 DB2表分割槽資料清空維護
清空一張表的資料,我們可以truncate這張表,亦或是用replace的方式載入乙個空檔案來清空表。那麼如果現在我只需清空表的某個分割槽的資料話,要如何來做呢?2b青年說 直接delete 條件嘛。那好,現在我有張表的情況是這樣的 每個分割槽中都有1g多點的資料,現在用delete來刪除1號分割槽...
db2 最大分割槽數 DB2 V9表分割槽(一)
關鍵字 ibm db2 v9 表分割槽 資料分割槽 範圍 表分割槽鍵 內容提要 db2 v9新增了表分割槽功能,因此對一些大表,我們在db2 v9中不再需要分拆成小表,再用union all 檢視的方式進行設計,而是直接用分割槽表實現一些這些功能。表分割槽功能是一種資料組織方案,即,表資料根據乙個或...
DB2 分割槽表增加分割槽
最近,需要在db2的分割槽表中增加新的分割槽,用於儲存資料,因此,就研究了db2表的分割槽機制。現在總結,實現的方式共有三種,分別是 1 建立臨時表,將原表資料匯入臨時表,之後將原表重建,擴大分割槽 2 通過alter table tab name add partition,為表增加分割槽 3 建...