在PostgreSQL 和 Hive中生成日期序列

## 在PostgreSQL 和 Hive中生成日期序列

### Postgresql實(shí)現(xiàn)日期序列

在postgresql中疾瓮,有 generate_series(start_date, end_date, interval)函數(shù)來(lái)生成日期序列

```

select date(day) as day

from generate_series('2020-05-22'::timestamp, current_date, '1 day'::interval) as day

```

### Hive實(shí)現(xiàn)指定指定開始結(jié)束日期的日期序列

在Hive中梅誓,可以借助 posexplode(list)滞诺、datediff(end_date, start_date)來(lái)實(shí)現(xiàn)越庇。

首先創(chuàng)建一個(gè)表名為calender十艾,字段為day乾巧,類型為date,存入一個(gè)日期數(shù)值作為開始日期查剖,比如2014-01-01。

```

CREATE TABLE default.calender (day DATE);

INSERT INTO TABLE default.calender VALUES(to_date('2014-01-01T00:00'));

```

借助 `datediff(end_date, start_date)`读跷、`space(int_count)`梗搅、`split(list,seperator)`禾唁、`posexplode(list) `生成n個(gè)空格效览,然后split成list,posexplode將行轉(zhuǎn)多列荡短,同時(shí)返回index和value丐枉。

```

select date_add(day,idx) as new_day from default.calender

lateral view posexplode( split( space( datediff( current_date, to_date('2014-01-01T00:00:00') ) ), ' ')? ) tt as idx, v;

```

中間過程解釋:

比如:

```

select datediff('2020-06-30','2020-05-1'); -- 60

select split(space(datediff('2020-06-30','2020-05-1')),' ') -- 生成60個(gè)空格,然后split成list

```

index | value

--- | ---

0 | ' '

1 | ' '

2 | ' '

... | ...

59| ' '

#### Hive在日期序列表添加星期幾

新增一列存放星期幾

```

ALTER TABLE default.calender ADD COLUMNS(weekday STRING);

```

借助函數(shù)`datediff`掘托,`pmod`就可以實(shí)現(xiàn)

datediff 是兩個(gè)日期相減的函數(shù)

語(yǔ)法:`datediff(string enddate, string startdate)`

返回值: int

說(shuō)明: 返回兩個(gè)時(shí)間參數(shù)的相差天數(shù)瘦锹。

pmod 是正取余函數(shù)

語(yǔ)法: `pmod(int a, int b),pmod(double a, double b)`

返回值: int double

說(shuō)明: 返回正的a除以b的余數(shù)

選取一個(gè)日期為星期日的日期作為參照日期,這里我選取了2013-12-29

`pmod(datediff( date, '2012-01-01'), 7)? `

返回值:int 0-6

0-6分別表示星期日-星期六

```

INSERT OVERWRITE TABLE default.calender

select date_add(day,idx) as `date`,

? ? -- 0-6 分別代表星期日-星期六

? ? case pmod(datediff(date_add(day,idx), to_date('2013-12-29T00:00:00')), 7)

? ? ? ? when 0 then '星期日'

? ? ? ? when 1 then '星期一'

? ? ? ? when 2 then '星期二'

? ? ? ? when 3 then '星期三'

? ? ? ? when 4 then '星期四'

? ? ? ? when 5 then '星期五'

? ? ? ? when 6 then '星期六'

? ? END as weekday

from default.calender

lateral view posexplode( split( space( datediff( to_date('2030-01-01T00:00:00') , to_date('2014-01-01T00:00:00') ) ), ' ')? ) tt as idx, v;

```

### 補(bǔ)充:Hive實(shí)現(xiàn)缺失日期的補(bǔ)全

在統(tǒng)計(jì)一些daily的metrics的時(shí)候,通常使用group by弯院,往往會(huì)存在某些日期沒有數(shù)據(jù)從而導(dǎo)致最后的結(jié)果表的日期其實(shí)不是連續(xù)的齊全序列辱士。

比如:

store_id | date | count

---- | ---- | -----

1 | 2020-04-02 | 45

2 | 2020-04-02 | 10

2 | 2020-04-03 | 10

1 | 2020-04-05 | 50

2 | 2020-04-06 | 10

1 | 2020-04-08 | 50

... | ...... | ....

針對(duì)這種情況,需要進(jìn)行以下步驟拆解:

1. 按照store_id進(jìn)行聚合听绳,找出最小颂碘、最大日期

2. 此時(shí),基于步驟1的CTE表進(jìn)行基于每個(gè)store_id的最小椅挣、最大日期的日期序列補(bǔ)全

```

select t.store_id, date_add(t.min_date, idx) as `date`

? ? from store_with_min_max_usage_date t

? ? lateral view posexplode(split(space(datediff(t.max_date, t.min_date)),' ')) pe as idx, v

```

3. 將步驟2的結(jié)果與之前的agg聚合結(jié)果表進(jìn)行`left join`头岔,對(duì)`NULL`用`COALESCE(v, 0)`進(jìn)行缺失值替換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鼠证,一起剝皮案震驚了整個(gè)濱河市峡竣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌量九,老刑警劉巖适掰,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荠列,居然都是意外死亡攻谁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門弯予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戚宦,“玉大人,你說(shuō)我怎么就攤上這事锈嫩∈苈ィ” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵呼寸,是天一觀的道長(zhǎng)艳汽。 經(jīng)常有香客問我,道長(zhǎng)对雪,這世上最難降的妖魔是什么河狐? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瑟捣,結(jié)果婚禮上馋艺,老公的妹妹穿的比我還像新娘。我一直安慰自己迈套,他們只是感情好捐祠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桑李,像睡著了一般踱蛀。 火紅的嫁衣襯著肌膚如雪窿给。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天率拒,我揣著相機(jī)與錄音崩泡,去河邊找鬼。 笑死猬膨,一個(gè)胖子當(dāng)著我的面吹牛允华,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寥掐,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼靴寂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了召耘?” 一聲冷哼從身側(cè)響起百炬,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎污它,沒想到半個(gè)月后剖踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衫贬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年德澈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固惯。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梆造,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葬毫,到底是詐尸還是另有隱情镇辉,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布贴捡,位于F島的核電站忽肛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烂斋。R本人自食惡果不足惜屹逛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汛骂。 院中可真熱鬧罕模,春花似錦、人聲如沸香缺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)图张。三九已至锋拖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祸轮,已是汗流浹背兽埃。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留适袜,地道東北人柄错。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苦酱,于是被迫代替她去往敵國(guó)和親售貌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359