比如,廣告投放計劃表,原主題表及業務表都是某個用戶投放某個廣告從哪一天開始到哪一天結束。
現在需求是,統計近一個月的廣告投放預算。這就需要先把拉鍊給展開,然後進行彙總統計。
當然,也可以根據一個月內每一個用戶的實際投放天數乘以它的每日投放預算得出,但這樣就有一些複雜邏輯判斷,比較麻煩,也不是不行。
主題表結構:
CREATE TABLE `dwt.dwt_seller_promotion_marketing_ad_plan_full_1d`(
`id` bigint COMMENT 'id',
`userinfo_id` bigint COMMENT '用戶id',
`title` string COMMENT '標題',
`start_date` timestamp COMMENT '計劃開始日期',
`end_date` timestamp COMMENT '計劃結束日期',
`start_hour` bigint COMMENT '開始小時',
`end_hour` bigint COMMENT '結束小時',
`plan_code` string COMMENT '計劃編號',
`is_long` bigint COMMENT '1:長期投放',
`bid` bigint COMMENT '出價,單位分',
`budget` bigint COMMENT '每日預算',
`spend` bigint COMMENT '累計花費',
`plan_status` bigint COMMENT '開關1開0關',
`sale_uris` string COMMENT '拍品uri',
`create_time` timestamp COMMENT '創建時間',
`update_time` timestamp COMMENT '更新時間',
`spend_update_time` timestamp COMMENT '花費更新時間',
`ad_type` bigint COMMENT '推廣類型,1:拍品推廣2:直播推廣'
) COMMENT '紅竹廣告計劃表' PARTITIONED BY (dt string) stored as orc tblproperties ("orc.compress"="snappy");
數據查詢示例:
hive> select id,userinfo_id,title,start_date,end_date
> from dwt_seller_promotion_marketing_ad_plan_full_1d
> where dt='2020-04-08'
> limit 13;
OK
10018 21747925 名家書法 2018-08-02 00:00:00 2018-08-03 00:00:00
10036 7150092 信札手記 2018-08-02 00:00:00 2022-08-02 00:00:00
10054 5017 南紅瑪瑙 2018-08-16 00:00:00 2018-08-16 00:00:00
10072 16277406 中國四大奇 2018-08-08 00:00:00 2018-08-09 00:00:00
10090 25791243 A計劃 2019-04-16 00:00:00 2023-04-16 00:00:00
10117 517174 內蒙戈壁碧玉老皮畫面景觀 2018-08-03 00:00:00 2022-08-03 00:00:00
10135 223270 大福源 2019-10-17 00:00:00 2023-10-17 00:00:00
1016 16335732 書畫篆刻29-28日 2018-07-06 00:00:00 2018-09-05 00:00:00
10216 28486278 紫檀大紅酸枝 2018-08-04 00:00:00 2022-08-04 00:00:00
10234 26659798 和田玉0806 2018-08-05 00:00:00 2022-08-05 00:00:00
10289 7507311 國畫葡萄 2018-08-05 00:00:00 2018-09-04 00:00:00
10315 14181722 試推1 2018-09-04 00:00:00 2022-09-04 00:00:00
10333 6363384 2018 2019-05-07 00:00:00 2023-05-07 00:00:00
Time taken: 0.161 seconds, Fetched: 13 row(s)
解鏈方法:
1、找出一天滿足條件的數據,然後批量跑出數據
hive> select id,userinfo_id,title,start_date,end_date
> from dwt_seller_promotion_marketing_ad_plan_full_1d
> where dt='2020-04-08'
> and start_date<='2020-04-08' and end_date>='2020-04-08'
> limit 13;
OK
10036 7150092 信札手記 2018-08-02 00:00:00 2022-08-02 00:00:00
10090 25791243 A計劃 2019-04-16 00:00:00 2023-04-16 00:00:00
10117 517174 內蒙戈壁碧玉老皮畫面景觀 2018-08-03 00:00:00 2022-08-03 00:00:00
10135 223270 大福源 2019-10-17 00:00:00 2023-10-17 00:00:00
10216 28486278 紫檀大紅酸枝 2018-08-04 00:00:00 2022-08-04 00:00:00
10234 26659798 和田玉0806 2018-08-05 00:00:00 2022-08-05 00:00:00
10315 14181722 試推1 2018-09-04 00:00:00 2022-09-04 00:00:00
10333 6363384 2018 2019-05-07 00:00:00 2023-05-07 00:00:00
10414 16159599 奇石20180807 2018-08-07 00:00:00 2022-08-07 00:00:00
10487 7222085 錢幣 2018-08-09 00:00:00 2022-08-09 00:00:00
10531 2084333 七天衝 2018-09-09 00:00:00 2022-09-09 00:00:00
10685 28767180 推廣 2018-08-10 00:00:00 2022-08-10 00:00:00
10711 430571 宣紙 2018-08-10 00:00:00 2022-08-10 00:00:00
Time taken: 0.151 seconds, Fetched: 13 row(s)
hive>
然後,將【2020-04-08】替換成日期參數,進行數據跑批得出全量每日滿足條件數據。
2、通過UDF函數將日期範圍變成List
自己寫udf函數,能實現將日期範圍轉換成日期範圍內的日期列表;然後通過[explode_lateral_view LATERAL VIEW explode(split(列,','))]將數據展開。