近期專案中使用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...