1. 程式人生 > 其它 >flink cdc 讀取mysql的binlog寫入hive中

flink cdc 讀取mysql的binlog寫入hive中

需求:查詢最近12個月的資料量,此處表的名稱為:ticket_ticket

按月查詢資料,sql語句如下:

SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')

查詢結果:

可以看出只有兩個月份,不滿足需求。

解決方案如下:

步驟一:生成一個月份表,包含最近的12個月

sql如下:

SELECT
	DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
	( 
	SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
	FROM ticket_ticket LIMIT 12)d
	ORDER BY date

結果如下:

步驟二:將查詢結果表併入月份表

sql語句:

SELECT * FROM (
SELECT
	DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
	( 
	SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
	FROM ticket_ticket LIMIT 12)d
	ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
)tab ON t=date

結果如下:

步驟三:處理查詢結果:NULL設定為0,並按照月份排序

sql語句:

SELECT date as 月份, IFNULL(tab.num, 0) as 數量 FROM (
SELECT
	DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
	( 
	SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
	FROM ticket_ticket LIMIT 12)d
	ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
)tab ON t=date

結果如下:

總結這裡用到的sql語句

  • DATE_FORMAT(date,format)
    定義:用於以不同的格式顯示日期/時間資料。即對時間進行格式轉換
    用法:date 引數是合法的日期。format 規定日期/時間的輸出格式。
DATE_FORMAT('2021-02-12','%Y-%m')

輸出:2021-02

  • CURDATE()
    定義:返回當前日期
    用法:直接使用CURDATE()
SELECT NOW(),CURDATE(),CURTIME()

結果: