FlinkSql 如何实现数据去重?

摘要

很多时候flink消费上游kafka的数据是有重复的,因此有时候我们想数据在落盘之前进行去重,这在实际开发中具有广泛的应用场景,此处不说详细代码,只粘贴相应的flinksql

代码

java 复制代码
--********************************************************************--
-- 创建临时表(只在当前sessoin生效的表称为临时表) DDL
CREATE TEMPORARY TABLE UserAttrSource ( 
    `data` string,
    `kafkaMetaTimestamp` TIMESTAMP(3) METADATA FROM 'timestamp', -- kafka record携带的源数据时间戳,参考官网kafka connector
    proctime as PROCTIME() -- 获取数据处理时间,这是flink内置支持的关键字
) WITH (
 	'connector' = 'kafka',
	'topic' = 'user_attri_ad_dirty_data',
	'properties.bootstrap.servers' = 'kafka地址',
	'scan.startup.mode' = 'timestamp', -- kafka扫描数据模式,参考官网kafka connector
  'scan.startup.timestamp-millis' ='1687305600000' , -- 2023-06-21 08:00:00
	'format' = 'raw' -- 意思是将kafka数据格式化为string
);

-- 创建SINK 表
CREATE TEMPORARY TABLE ADB (
   log_date DATE,
  `errorType` int,
   appId string,
  `errorCode` int,
  `errorReason` string,
  `deserialization` string,
  `originalData` string,
   kafkaMetaTimestamp TIMESTAMP,
   data_hash string,
   PRIMARY KEY (`data_hash`) NOT ENFORCED
)
WITH (
  'connector' = 'adb3.0',
  'url' = 'jdbc:mysql://xxxx:3306/flink_data?rewriteBatchedStatements=true',
  'tableName' = 'usr_attr_dirty', 
  'userName'='username',
  'password'='password'
);
-- 去重视图, 这是关键(json_value是flink的内置函数,data_hash是数据本身的primary key)
-- 下述语句含义是:根据data_hash字段分组,按照处理时间排序,取出最新的一条数据,其他的重复数据将被抛弃
CREATE TEMPORARY VIEW quchong AS
  SELECT 
    data,
    kafkaMetaTimestamp FROM (
      SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY json_value(data,'$.data_hash') ORDER BY proctime DESC) as row_num
      FROM UserAttrSource
       )
  WHERE row_num = 1;
  
--  插入目标表
insert into ADB
select 
  TO_DATE(DATE_FORMAT(kafkaMetaTimestamp,'yyyy-MM-dd') )AS log_date,
  json_value(data,'$.errorType' RETURNING INT) errorType,
  json_value(data,'$.appId' NULL ON EMPTY) appId,
  json_value(data,'$.errorCode'  RETURNING INT) errorCode,
  json_value(data,'$.errorReason' NULL ON EMPTY) errorReason,
  json_value(data,'$.deserialization' NULL ON EMPTY) deserialization,
  json_value(data,'$.originalData') originalData,
  kafkaMetaTimestamp,
  json_value(data,'$.data_hash') data_hash
from quchong;
相关推荐
本旺3 天前
Flink 2.x状态演进:理解解 1.x 与 2.x 状态存储机制
大数据·flink
Apache Flink3 天前
从结构化到多模态:Apache Flink,多模态数据处理的流式底座
大数据·flink·apache
婉然从物3 天前
Flink SQL 元数据持久化实战:从“每次重启表消失”到“Hive Metastore 永久存储”
hive·sql·flink
@SmartSi4 天前
新一代实时数据集成框架 Flink CDC 3.0 架构解析
flink·cdc
TTBIGDATA4 天前
【Ambari Plus】12.Flink 安装
hive·hadoop·flink·ambari·hdp·cdh·bigtop
xuruilll7 天前
数据中台开发 - (一)概述
大数据·数据库·数据仓库·flink
董可伦8 天前
Flink CDC2Kafka 总结
大数据·flink·cdc
大大大大晴天8 天前
Flink JDBC Connector 深度解析:从原理到最佳实践
flink
阿坤带你走近大数据9 天前
大数据中的各种场景数据倾斜的介绍
大数据·hadoop·flink·kafka
一条鱼丶10 天前
深入理解 Flink Watermark——流数据处理中的乱序问题解决方案
flink