近期專案中使用hive做資料統計,建立了一些hive表,在這個過程中,涉及到了設計分割槽的問題,簡單做個總結,以新增表為例:
create table if not exists stat_install(
uuid string,
ver int,
version_code int,
channel int,
ipaddr bigint,
dpi int,
device int,
os int,
country int,
language string,
province int,
agent string,
network int,
upgrade int,
install_date string
) partitioned by (year int, month int, day int, hour int)
row format delimited fields terminated by "#";
v1版本,按照year,month,day,hour分割槽。
分割槽的字段比較細,統計小時任務只需指定 hour = ?;統計天任務只需指定day = ?;年任務 year = ?;
看起來不錯,但是當跑周任務或者跨天的任務時候,就很難用year,month,day去表示乙個時間段了,
這時候就需要使用install_date欄位取表示範圍
例如:查詢 2015-01-19 開始一周的資料:
install_date >= '2015-01-19' and install_date < '2015-01-26';
而install_date並非分割槽字段,查詢起來是非常慢的;而且這樣分割槽還有乙個弊端就是檔案分的過細;
create table if not exists stat_install(
uuid string,
ver int,
version_code int,
channel int,
ipaddr bigint,
dpi int,
device int,
os int,
country int,
language string,
province int,
agent string,
network int,
upgrade int,
install_date string
) partitioned by (dt string)
row format delimited fields terminated by "#";
v2版本,重新按照dt分割槽,例如:dt = 『2015-01-19』,這樣可以很好地解決跨天的問題,
但是小時任務只能根據install_date去做限定。
例如:查詢 2015-1-19號 hour = 10 的資料:
install_date >= '2015-01-19 10:00:00' and install_date < '2015-01-19 11:00:00'
v2版本相對v1,處理資料更方便。
如果小時資料比較多,也可以考慮v3版本使用: (dt string, hour int)進行分割槽。
如果涉及海外資料的話,需要考慮時區問題,可以通過設定伺服器時區為東八區;
或者不想設定時區的話,分割槽使用時間戳的形式,從統計到前端展示都使用時間差戳。
時間戳的缺點是不直觀, 如果hive中的資料出錯,不好排查。
hive分割槽表新增字段出現新增欄位null的bug
對於hive分割槽表,我們使用alter語句新增欄位後 如alter table table name add columns age int 再重寫之前已經存在的分割槽,會出現使用查詢語句查出來的新增字段顯示null值。例如 表a 分割槽dt,已有分割槽dt a 由於需求新增了乙個字段,然後重新寫...
hive表分割槽
hive對錶有分割槽的功能。hive根據表的列屬性值 諸如日期,城市 部門對錶進行分割槽 使用分割槽,能夠很容易查詢 到資料的一部分。表或分割槽被分為 buckets 桶 以便為資料 提供額外的資料結構,該資料結構被 用於提公升 查詢的有效性。buckets 桶 的工作依賴於表中某個列的 雜湊函式值...
Hive 表分割槽
基本知識 hadoop fs rmr hdfs hdfs hadoop fs put user hive warehouse data.txt hdfs hdfs data.txt 建立分割槽表 外部表 create external table if not exists employee id ...