hive表分割槽字段需要注意的問題

2021-08-27 20:00:25 字數 2176 閱讀 8542

近期專案中使用hive做資料統計,建立了一些hive表,在這個過程中,涉及到了設計分割槽的問題,簡單做個總結,以新增表為例:

v1版本:

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 "#";

v2版本:

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 "#";

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並非分割槽字段,查詢起來是非常慢的;而且這樣分割槽還有乙個弊端就是檔案分的過細;

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中的資料出錯,不好排查。

Object c block需要注意的幾點問題

摘自 date 2015 12 4 1.block定義 1 說明 a.block是oc中的一種資料型別,在ios開發中被廣泛使用 b.是block的特有標記 c.block的實現 包含在 之間 d.大多情況下,以內聯inline函式的方式被定義和使用 e.block與c語言的函式指標有些相似,但使用...

Mysql中的字段型別和語法需要注意的問題

資料庫儲存日期格式時,如何考慮時區轉換問題?datetime 的日期範圍是 1001 9999 年 儲存時間與時區無關 儲存空間為 8 位元組 timestamp 的時間範圍是 1970 2038 年,儲存時間與時區有關 顯示的值也依賴於時區 儲存空間為 4 位元組 注 時區問題請指定 jvm和my...

《轉》hive表時間分割槽字段

近期專案中使用hive做資料統計,建立了一些hive表,在這個過程中,涉及到了設計分割槽的問題,簡單做個總結,以新增表為例 create table if not exists stat install uuid string,ver int,version code int,channel int...