【实时数仓】Day04-DWS层业务:DWS设计、访客宽表、商品主题宽表、流合并、地区主题表、FlinkSQL、关键词主题表、分词
一、DWS层与DWM设计
1、思路
之前已经进行分流
但只需要一些指标进行实时计算,将这些指标以主题宽表的形式输出
2、需求
访客、商品、地区、关键词四层的需求(可视化大屏展示、多维分析)


3、DWS层定位
轻度聚合、主题中管理
二、DWS层-访客主题宽表的计算

DWS表主要包含维度表和事实表
维度表主要包括渠道、地区、版本、新老用户等
事实表主要包括PV、UV、跳出次数、进入页面数(session_count)、连续访问时长等
1、需求分析
合并接收到的数据流,按时间窗口聚合,并将聚合结果写入数据库
2、实现
(1)读取kafka各个流的数据
page_log、dwm_uv、dwm_jump_user跳出用户
(2)合并读取到的数据流
使用union合并两个结构相同的数据流
需要提前调整数据结构封装主题宽表实体类(两个待合并的流也都要是这样的结构)
userJumpDStream.map实现转换
合并4条输入的流:
uniqueVisitStatsDstream.union(
pageViewStatsDstream,
sessionVisitDstream,
userJumpStatDstream
);
(3)根据维度进行聚合
设置时间标记及水位线
4个维度作为key,使用tuple4组合,进行分组,.keyBy(new KeySelector
reduce窗口内聚合,并补充时间字段
(4)写入OLAP数据库ClickHouse
专门解决大量数据统计分析的数据库,在保证了海量数据存储的能力,同时又兼顾了响应速度
先建表,使用 ReplacingMergeTree 引擎来保证幂等性
将日期变为数字作为分区类型
编写ClickhouseUtils工具类
创建 TransientSink 注解,标记不需要保存的字段
配置连接地址类,并增加写入OLAP的sink
查看控制台输出及表中数据 visitor_stats_2021
三、商品主题宽表

把多个事实表的明细数据汇总起来组合成宽表
1、需求及思路
获取数据流并转换为统一的数据对象格式
将统一数据结构合并为一个流
设定事件时间与水位线,分组、开窗、聚合
关联维度表补充数据
写入ClickHouse
2、功能实现
建商品统计实体类(各种业务数据的统计),并给必要字段添加@Builder.Default注解,各类添加@Builder注解(构造方法)
kafka中获取指定的流:FlinkKafkaConsumer<String> pageViewSource = MyKafkaUtil.getKafkaSource(pageViewSourceTopic,groupId);
对各种流数据进行结构转换,转换为构建的实体类
创建电商业务常量类 GmallConstant,类似维度表,用一个数字表示一个字符串
将统一的数据结构合并为一个流
设定事件时间与水位线
按商品id分组,10秒的窗口进行开窗window(TumblingEventTimeWindows.of(Time.seconds(10)))
补充商品维度、SKU维度、品类维度、品牌维度等信息
SingleOutputStreamOperator<ProductStats> productStatsWithTmDstream =
AsyncDataStream.unorderedWait(productStatsWithCategory3Dstream,
new DimAsyncFunction<ProductStats>("DIM_BASE_TRADEMARK") {
@Override
public void join(ProductStats productStats, JSONObject jsonObject) throws
Exception {
productStats.setTm_name(jsonObject.getString("TM_NAME"));
}
@Override
public String getKey(ProductStats productStats) {
return String.valueOf(productStats.getTm_id());
}
}, 60, TimeUnit.SECONDS);
productStatsWithTmDstream.print("to save");
ClickHouse中创建商品主题宽表,添加写入ch的sink
//TODO 7.写入到 ClickHouse
productStatsWithTmDstream.addSink(
ClickHouseUtil.<ProductStats>getJdbcSink(
"insert into product_stats_2021 values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"));
查看ClickHouse表中的数据
四、地区主题表(Flink SQL)

1、需求分析
定义 Table 流环境,把数据源定义为动态表
通过 SQL 查询出结果表并转换为数据流
将数据流写入目标数据库
2、功能实现
(1)添加FlinkSQL依赖
(2)定义 Table 流环境StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);
(3)将数据源topic定义为动态表WITH (" + MyKafkaUtil.getKafkaDDL(orderWideTopic, groupId) + ")");
WATERMARK FOR rowtime AS rowtime 是把某个虚拟字段设定为 EVENT_TIME
(4)拼接 Kafka 相关属性到 DDL
(5)做聚合运算
Env.sqlQuery("select " +……并将其转换为数据流
DataStream<ProvinceStats> provinceStatsDataStream =
tableEnv.toAppendStream(provinceStateTable, ProvinceStats.class);
(6)定义地区统计宽表实体类并写入到ClickHouse(addSink)
五、关键词主题表(Flink SQL)
1、需求分析
维度聚合决定关键词的大小
来源:用户在搜索框中的搜索、以商品为主题的统计中获取
2、搜索关键词的实现
(1)使用IK分词器对字符串进行分词
(2)编写自定义函数,将分词器加入FlinkSQL中
Flink的自定义函数包括:Scalar Function(相当于 Spark 的 UDF)、Table Function(相当于 Spark 的 UDTF)、Aggregation Functions (相当于 Spark 的 UDAF)
由于分词是一对多的拆分,应该选择TableFunction
封装 KeywordUDTF 函数,自定义UDTF,继承TableFunction
(3)定义Table流环境
(4)注册自定义函数,将数据源定义为动态表
(5)过滤非空数据 tableEnv.sqlQuery
(6)利用 UDTF 进行拆分(SQL内部)LATERAL TABLE(ik_analyze(fullword)) as T(keyword)");
(7)聚合,根据各个关键词出现次数进行 ct
(8)转换为流并写入 ClickHouse
建表、封装实体类、添加sink
六、总结
1、DWS 层主要是基于 DWD 和 DWM 层的数据进行轻度聚合统计
2、利用 union 操作实现多流的合并
3、窗口聚合操作
4、对 clickhouse 数据库的写入操作
5、FlinkSQL 实现业务
6、分词器的使用
7、在 FlinkSQL 中自定义函数的使用
【实时数仓】Day04-DWS层业务:DWS设计、访客宽表、商品主题宽表、流合并、地区主题表、FlinkSQL、关键词主题表、分词的更多相关文章
- 美团点评基于 Flink 的实时数仓建设实践
https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...
- 基于 Kafka 的实时数仓在搜索的实践应用
一.概述 Apache Kafka 发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka 社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得 ...
- 实时数仓(二):DWD层-数据处理
目录 实时数仓(二):DWD层-数据处理 1.数据源 2.用户行为日志 2.1开发环境搭建 1)包结构 2)pom.xml 3)MykafkaUtil.java 4)log4j.properties ...
- HBase实战 | 知乎实时数仓架构演进
https://mp.weixin.qq.com/s/hx-q13QteNvtXRpNsE5Y0A 作者 | 知乎数据工程团队编辑 | VincentAI 前线导读:“数据智能” (Data Inte ...
- (转)用Flink取代Spark Streaming!知乎实时数仓架构演进
转:https://mp.weixin.qq.com/s/e8lsGyl8oVtfg6HhXyIe4A AI 前线导读:“数据智能” (Data Intelligence) 有一个必须且基础的环节,就 ...
- flink实时数仓从入门到实战
第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...
- 基于Flink构建全场景实时数仓
目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...
- 基于 Flink 的实时数仓生产实践
数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战.在智能商业中,数据的结果代表了用户反馈.获取数据的及时性尤为重要.快速获取数据反馈能够帮助公司更快地做出决策,更好地进行 ...
- 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...
- Clickhouse实时数仓建设
1.概述 Clickhouse是一个开源的列式存储数据库,其主要场景用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告.今天,笔者就为大家介绍如何使用Clickhouse来构建实 ...
随机推荐
- 原生Redis跨数据中心双向同步优化实践
一.背景 公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度.需要保证多数据中心容灾或者实现用户就近访问的话,需要各个数据中心拥 ...
- OSS对象存储
OSS对象存储 当项目以微服务搭建时,多个服务往往运行在多台服务器上,此时针对存储文件的获取和保存,难以确定具体的位置: 针对这个问题,一般有两个办法: 搭建独立的文件存储服务器,用 FastDFS等 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
转载来源:https://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html 一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整 ...
- 一键生成通用高亮代码块到剪贴板,快捷粘贴兼容 TT/WX/BJ 编辑器
有些在线图文编辑器不支持直接插入代码块,但可以直接粘贴 HTML 格式的高亮代码块. 花了一点时间研究了一下各家的编辑器,规则却各不相同.有的要求代码块被包含于 <code> ... &l ...
- CentOS 7.9 安装 Containerd-1.6.5
一.CentOS 7.9 安装 Containerd-1.6.5 地址 https://containerd.io/downloads 在安装containerd前,我们需要优先升级libseccom ...
- Linux-->文件目录作用查询
Linux的目录结构 在Linux中他的根目录都是决定好的无法改名,并且每一个目录他的作用都是决定好的 在Linux中一切都是文件!,Linux会把所有的硬件都映射成文件 / 代表根目录 /bin / ...
- Vue3.x+element-plus+ts踩坑笔记
闲聊 前段时间小颖在B站找了个学习vue3+TS的视频,自己尝试着搭建了一些基础代码,在实现功能的过程中遇到了一些问题,为了防止自己遗忘,写个随笔记录一下嘻嘻 项目代码 git地址:vue3.x-ts ...
- HTML+CSS基础知识(2)选择器的使用、盒子模型的讲解、列表的使用
文章目录 1.CSS基础知识 2.css样式 2.1.代码: 2.2 测试结果 3.CSS的语法 3.1 代码 4.块元素和行内元素 4.1 代码 4.2 测试结果 5.常用的选择器 5.1 代码块 ...
- 齐博x1小程序集群一个重要功能升级,可以根据圈子会员组显示不同的菜单。
如下图所示,虽然之前圈子小程序可以自定义会员中心菜单,但是存在一个问题,就是所有会员,比如圈主与普通会员的菜单都将是一样的. 现在升级后,就可以设置不同的圈子会员组,拥有不同的菜单. 比如一个商家,店 ...
- .NET性能系列文章一:.NET7的性能改进
这些方法在.NET7中变得更快 照片来自 CHUTTERSNAP 的 Unsplash 欢迎阅读.NET性能系列的第一章.这一系列的特点是对.NET世界中许多不同的主题进行研究.比较性能.正如标题所说 ...