HIVE關於環比資料實現的方法

2021-10-14 15:08:15 字數 2816 閱讀 2166

本篇介紹同期環比與月份環比之間比較的sql寫法

場景1:同期環比

最近在解決業務需求時,遇到了hivesql裡面關於同期資料的環比計算。

業務場景為:

按月份計算資料及其對應的環比資料,月份資料展示為最後一天資料資訊

如當前一月則一月當日與十二月同期比較,十二月月末與十一月月末比較

環比計算公式為

當前時間計算:

(當前時間資料-上月同期資料)/上月同期資料

歷史時間計算:

(上月月末資料-上上月末資料)/上上月末資料

資料存放為:

表a存放每日資料(每日為當月累計資料,即2號為1號加2號資料),月份資料展示為最後一天資料資訊。

字段:時間(data_time),資料量cc

data_time

cc2021-01-12

802021-01-1160…

…2020-12-3160…

…2020-12-1240…

…2020-11-30

20應展示為:

實現思路

1.考慮臨時表取出當月資料與上月同期資料

將規律資料與不規律資料分而治之,當月與歷史月分開處理

關鍵函式:上月同期使用函式add_months獲取,最後一天資料使用last_day獲取

例1:2.考慮將資料全部排序後取排序資料

使用hive的自帶函式lead結合開窗函式取出資料與上月對應資料

關鍵函式:上月同期使用函式add_months獲取,最後一天資料使用last_day獲取,lead往下行數獲取資料,使用over開窗分組排序

資料格式取值需求為:

data_time

cc2021-01-12

802020-12-12

402020-12-31

602020-11-30

20難點在於:

1.獲取資料上月同期資料,將資料規整後直接取出上月環比值;

2.資料排序後月資料2020-12-31會出現在2020-12-12前,如果通過2021-01-12獲取前行的資料為2020-12-31

3.如何實現排序可以通過2021-01-12下行為2020-12-12,我採取的方式為資料雙分組

例2:步驟1:

求出當月-當前日期資料與上月同期資料

歷史月-最後一天資料

資料為:

data_time

cc2021-01-12

802020-12-31

602020-12-12

402020-11-30

20步驟2:

通過over開窗函式,兩次排序實現年月desc,同年月asc排序,並根據lead當前行求出往下一行資料

20步驟3:

過濾掉2020-12-12資料,直接求出環比資料

場景2:每月環比

1.自關聯表

with tmp1 as (

select

substr(data_time,1,7) data_time,

max(cc) cc

from a

group by substr(data_time,1,7)

)select

t1.data_time,

t1.cc,

(t1.cc-t2.cc)/t2.cc

from

tmp1 t1 join tmp2 t2

on t1.data_time=substr(add_months(concat(t2.data_time,』-01』),1),1,7)

2.臨時表加1月

with tmp1 as (

select

substr(data_time,1,7) data_time,

max(cc) cc

from a

group by substr(data_time,1,7)

),tmp2 as (–使用加乙個月記錄上月資料,關聯時月份相同即可

select

substr(add_months(concat(t2.data_time,』-01』),1),1,7),

ccfrom tmp1

)select

t1.data_time,

t1.cc,

(t1.cc-t2.cc)/t2.cc

from

tmp1 t1 join tmp2 t2

on t1.data_time=t2.data_time;

獲取在initData中本地資料實現方法

getmeidiodata 另開起乙個執行緒實現這個方法private void getmeidiodata 通過得到內容提供者,去呼叫query方法,再通過方法中的路徑得到物件集 並把它們裝入乙個集合中 cursorcursor resolver.query uri,object,null,nul...

hive資料抽樣的方法

塊抽樣 block sampling hive 本身提供了抽樣函式,使用 tablesample 抽取指定的 行數 比例 大小,舉例 create table iteblog as select from iteblog1 tablesample 1000 rows create table ite...

業務資料實體(model) 需要轉殖的方法

業務資料實體 model 需要轉殖的時候 可以使用 json.deserialize json.serialize inqresult json序列化再反序列化 方法二 例如實體名稱 inquireresult 實體中包含實體 cfettrade 實體 實現icloneable 介面,實體中新增方法...