Flink 时态维度表 Join 与缓存机制实战
一、引言:为什么需要时态维度表?
在实时数仓建设中,维度表是不可或缺的一环,例如:
-
风控系统中,用户的风险等级在不同时间可能变化;
-
营销体系中,商品的促销标签会动态调整;
-
运营数据中,组织架构经常有调整。
时态维度表(Temporal Table),允许我们在流处理过程中,按事件时间 Join 上对应时刻的维度信息,是保障数据正确性的关键。
如果直接实时查询外部数据库,容易造成:
-
高延迟:每条流式数据都查询一次,压力大。
-
不稳定:外部系统故障会影响整个作业。
因此,本地缓存机制 + 定时刷新 成为实时场景下维度 Join 的标准做法。
二、常见的 Flink 维度表 Join 方式
Join 方式 | 特点 | 场景适用 |
---|---|---|
直接关联(数据库查) | 简单、易实现;但延迟高 | 流量极小的场景 |
广播流 Join | 把维度表广播到所有 Task,内存查询 | 小规模维度表 |
Async I/O Join | 异步请求外部系统,支持高吞吐 | 适合中等规模,需处理超时 |
Temporal Table Join | Flink 官方支持,按时间精确匹配 | 数据正确性要求高 |
自定义缓存机制 | 本地缓存+定时刷新,灵活可控 | 大规模、高并发必备 |
重点:本篇专注讲解「广播流 Join」和「自定义缓存」实战。
三、业务需求举例:实时用户信息补充
-
事实流:用户浏览日志流(user_id、page_id、event_time)
-
维度表:用户信息表(user_id、user_level、user_tag,有效期变化)
实时需求:
-
实时给浏览日志补充用户当前等级、标签
-
支持用户信息动态更新(例如用户升等级)
四、广播维度表 Join 示例
1. 维度表读取并广播
DataStream<UserInfo> userInfoStream = env .addSource(new UserInfoSource()) // 自定义 Source,定时拉取维度表 .broadcast(userInfoStateDescriptor);
这里 userInfoStateDescriptor
是定义的广播状态。
2. 事实流与维度表 Join
SingleOutputStreamOperator<UserLogEnriched> enrichedStream = userLogStream .connect(userInfoStream) .process(new EnrichUserLogFunction());
其中 EnrichUserLogFunction
是 BroadcastProcessFunction
,实现流对广播状态的查询与补充。
五、完整代码工程模板
项目结构示例:
flink-realtime-standardization/
├── pom.xml
├── src/main/java/
│ ├── com.example.flink.config/
│ │ └── SourceBuilder.java
│ │ └── SinkBuilder.java
│ ├── com.example.flink.model/
│ │ └── UserLog.java
│ │ └── UserInfo.java
│ ├── com.example.flink.process/
│ │ └── EnrichUserLogFunction.java
│ ├── com.example.flink.job/
│ │ └── UserLogStandardizationJob.java
└── src/main/resources/└── application.yml
核心类说明:
-
SourceBuilder
:统一封装 Kafka Source / 维度表 Source 创建。 -
SinkBuilder
:封装写回 Kafka / Doris 等 Sink。 -
UserLog
、UserInfo
:标准化后的事实表和维度表 POJO。 -
EnrichUserLogFunction
:处理事实流和广播流 Join。
六、标准化字典管理样例
维度表管理,可以参考:
[ { "table": "user_info", "key": "user_id", "fields": [ {"name": "user_level", "type": "STRING"}, {"name": "user_tag", "type": "STRING"} ], "update_mode": "periodic", "refresh_interval_seconds": 300 } ]
配置支持说明:
-
table
:维度表名 -
key
:Join 的主键 -
fields
:需要提取的字段 -
update_mode
:更新模式(periodic 定时刷新 / trigger 触发刷新) -
refresh_interval_seconds
:刷新频率
实际程序中,可以根据配置动态加载/刷新缓存。
七、自定义缓存机制优化
缓存结构设计:
Map<String, UserInfo> cache = new ConcurrentHashMap<>();
定时刷新机制示例:
// 每5分钟异步拉取最新数据更新本地缓存 env.addSource(new RefreshUserInfoSource()) .addSink(new UpdateUserInfoCacheSink());RefreshUserInfoSource:拉取外部 MySQL / Redis 等数据源UpdateUserInfoCacheSink:更新本地缓存
查询使用示例:
UserInfo userInfo = cache.get(userId); if (userInfo != null) { // enrich }
八、时态表 Join 示例(高级)
如果使用 Flink SQL,可以直接通过 Temporal Join:
SELECT log.user_id, log.page_id, user.user_level FROM user_log AS log LEFT JOIN user_info FOR SYSTEM_TIME AS OF log.event_time AS user ON log.user_id = user.user_id
注意事项:
-
FOR SYSTEM_TIME AS OF
是关键字。 -
维度表需要是
Versioned Table Source
支持版本控制。 -
可基于 Hudi、Iceberg、Delta 等支持时间版本控制的存储。
九、总结与最佳实践
问题 | 最佳实践 |
---|---|
维度表小且更新频繁 | 广播 Join + 定时刷新 |
维度表中等规模 | Async I/O Join(加超时重试) |
维度表超大且变化频繁 | 建议异步预加载 + 缓存分片管理 |
对一致性要求极高 | 使用 Temporal Join(Flink SQL 或 API) |
附:维度表缓存管理模块工程示例
1. 工程结构
假设挂到你的 com.example.flink.dim
包下面:
com.example.flink.dim/
├── cache/
│ ├── DimensionCacheManager.java
│ ├── DimensionCacheLoader.java
│ ├── DimensionBroadcastProcessFunction.java
├── model/
│ ├── DimensionConfig.java
│ ├── DimensionRecord.java
└── source/└── DimensionSourceFunction.java
2. 主要模块讲解
(1)DimensionConfig.java
【维度表配置信息】
package com.example.flink.dim.model;import java.io.Serializable;
import java.util.List;public class DimensionConfig implements Serializable {private String tableName;private String keyField;private List<String> fields;private String updateMode; // periodic / triggerprivate int refreshIntervalSeconds;// getters and setters
}
(2)DimensionRecord.java
【单条维度记录】
package com.example.flink.dim.model;import java.io.Serializable;
import java.util.Map;public class DimensionRecord implements Serializable {private String key;private Map<String, Object> fieldMap; // 字段名 -> 字段值public DimensionRecord(String key, Map<String, Object> fieldMap) {this.key = key;this.fieldMap = fieldMap;}// getters
}
(3)DimensionCacheManager.java
【本地缓存管理】
package com.example.flink.dim.cache;import com.example.flink.dim.model.DimensionRecord;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;public class DimensionCacheManager {private static final Map<String, DimensionRecord> cache = new ConcurrentHashMap<>();public static void put(String key, DimensionRecord record) {cache.put(key, record);}public static DimensionRecord get(String key) {return cache.get(key);}public static void updateAll(Map<String, DimensionRecord> newCache) {cache.clear();cache.putAll(newCache);}public static int size() {return cache.size();}
}
(4)DimensionSourceFunction.java
【维度表拉取 Source】
package com.example.flink.dim.source;import com.example.flink.dim.cache.DimensionCacheManager;
import com.example.flink.dim.model.DimensionRecord;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import java.util.HashMap;
import java.util.Map;public class DimensionSourceFunction extends RichSourceFunction<Map<String, DimensionRecord>> {private volatile boolean running = true;private final int refreshIntervalSeconds;public DimensionSourceFunction(int refreshIntervalSeconds) {this.refreshIntervalSeconds = refreshIntervalSeconds;}@Overridepublic void run(SourceContext<Map<String, DimensionRecord>> ctx) throws Exception {while (running) {// 从外部系统加载数据Map<String, DimensionRecord> dimData = loadDimensionData();ctx.collect(dimData);Thread.sleep(refreshIntervalSeconds * 1000L);}}@Overridepublic void cancel() {running = false;}private Map<String, DimensionRecord> loadDimensionData() {// 🚀 这里你可以接 MySQL / Redis / Hudi 之类的Map<String, DimensionRecord> result = new HashMap<>();// 示例result.put("user_1", new DimensionRecord("user_1", Map.of("level", "VIP", "tag", "new_user")));return result;}
}
(5)DimensionBroadcastProcessFunction.java
【事实流与广播流的处理器】
package com.example.flink.dim.cache;import com.example.flink.dim.model.DimensionRecord;
import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction;
import org.apache.flink.util.Collector;
import org.apache.flink.api.common.state.MapStateDescriptor;public class DimensionBroadcastProcessFunction<IN, OUT> extends BroadcastProcessFunction<IN, Map<String, DimensionRecord>, OUT> {private final MapStateDescriptor<String, DimensionRecord> stateDescriptor;private final EnrichmentFunction<IN, OUT> enrichmentFunction;public DimensionBroadcastProcessFunction(MapStateDescriptor<String, DimensionRecord> stateDescriptor,EnrichmentFunction<IN, OUT> enrichmentFunction) {this.stateDescriptor = stateDescriptor;this.enrichmentFunction = enrichmentFunction;}@Overridepublic void processElement(IN value, ReadOnlyContext ctx, Collector<OUT> out) throws Exception {String key = enrichmentFunction.extractKey(value);DimensionRecord dimRecord = DimensionCacheManager.get(key);OUT enriched = enrichmentFunction.enrich(value, dimRecord);out.collect(enriched);}@Overridepublic void processBroadcastElement(Map<String, DimensionRecord> dimData, Context ctx, Collector<OUT> out) throws Exception {DimensionCacheManager.updateAll(dimData);}public interface EnrichmentFunction<IN, OUT> {String extractKey(IN input);OUT enrich(IN input, DimensionRecord dimRecord);}
}
✅ 支持自定义的 enrich 逻辑,不限制数据模型!
(6)UserLogEnrichmentFunction.java
【用于维度 enrich】
package com.example.flink.dim.cache;import com.example.flink.dim.model.DimensionRecord;
import com.example.flink.model.UserLog;
import com.example.flink.model.UserLogEnriched;public class UserLogEnrichmentFunction implements DimensionBroadcastProcessFunction.EnrichmentFunction<UserLog, UserLogEnriched> {@Overridepublic String extractKey(UserLog input) {return "user_" + input.getUserId();}@Overridepublic UserLogEnriched enrich(UserLog input, DimensionRecord dimRecord) {if (dimRecord == null) {// 如果没有找到维度,直接返回原数据return new UserLogEnriched(input.getUserId(),input.getEventType(),null,null,input.getTimestamp());}String level = (String) dimRecord.getFieldMap().getOrDefault("level", null);String tag = (String) dimRecord.getFieldMap().getOrDefault("tag", null);return new UserLogEnriched(input.getUserId(),input.getEventType(),level,tag,input.getTimestamp());}
}
UserLog.java
(原始事实流)
package com.example.flink.model;import java.io.Serializable;public class UserLog implements Serializable {private String userId;private String eventType;private long timestamp;// constructorpublic UserLog() {}public UserLog(String userId, String eventType, long timestamp) {this.userId = userId;this.eventType = eventType;this.timestamp = timestamp;}// getters and setters
}
UserLogEnriched.java
(经过 enrich 后的新模型)
package com.example.flink.model;import java.io.Serializable;public class UserLogEnriched implements Serializable {private String userId;private String eventType;private String userLevel;private String userTag;private long timestamp;public UserLogEnriched() {}public UserLogEnriched(String userId, String eventType, String userLevel, String userTag, long timestamp) {this.userId = userId;this.eventType = eventType;this.userLevel = userLevel;this.userTag = userTag;this.timestamp = timestamp;}// getters and setters
}
3. 主程序集成示例(挂到你的 Job 中)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 维度流
DataStream<Map<String, DimensionRecord>> dimStream = env.addSource(new DimensionSourceFunction(300)) // 每300秒刷新.broadcast(new MapStateDescriptor<>("dimensionBroadcastState", String.class, DimensionRecord.class));// 事实流
DataStream<UserLog> userLogStream = SourceBuilder.getKafkaSource(env);// 事实流和维度表广播流 Join
SingleOutputStreamOperator<UserLogEnriched> enrichedStream = userLogStream.connect(dimStream).process(new DimensionBroadcastProcessFunction<>(new MapStateDescriptor<>("dimensionBroadcastState", String.class, DimensionRecord.class),new UserLogEnrichmentFunction() // 你自己定义具体 enrich 逻辑));
✨ 整体特点
-
模块化清晰:可以直接插到你原有 Flink 工程里。
-
支持动态刷新:支持定时拉取最新维度。
-
高性能:本地 ConcurrentHashMap 查询,低延迟。
-
灵活扩展:只要实现 EnrichmentFunction 就能适配各种事实表。
记住一句话:缓存是为了抗压,时态是为了正确,选择合适的策略,平衡延迟与准确率。
相关文章:
Flink 时态维度表 Join 与缓存机制实战
一、引言:为什么需要时态维度表? 在实时数仓建设中,维度表是不可或缺的一环,例如: 风控系统中,用户的风险等级在不同时间可能变化; 营销体系中,商品的促销标签会动态调整ÿ…...
Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险
CVE-2025-24813Apache Tomcat 中发现了一个严重安全漏洞,标识为,该漏洞可能导致服务器面临远程代码执行 (RCE)、信息泄露和数据损坏的风险。 此缺陷影响以下版本: Apache Tomcat11.0.0-M1通过11.0.2Apache Tomcat10.1.0-M1通过10.1.34Apache Tomcat9.0.0-M1通过9.0.98了解 …...
来自B站-AI匠的“RAG的prompt设计指南“的部分截图
来自B站-AI匠的“RAG的prompt设计指南“的部分截图 0. 引言1. RAG提示词 - 部分视频截图2. 总结 - 部分视频截图3. 举例 - 部分视频截图 0. 引言 这个文章记录的是B站Up主AI匠关于RAG的prompt设计指南的视频截图。 1. RAG提示词 - 部分视频截图 笔记: Up主推荐Fa…...
【Linux】Centos7 在 Docker 上安装 Redis7.0(最新详细教程)
一、拉取 Redis 镜像 1. 从 阿里云加速器(docker hub)拉取 redis镜像,选择镜像标签为 7.2.4 docker pull redis:7.2.4 2. 准备 Redis 的配置文件(便于后期对配置文件进行修改) 3.在服务器上创建需要挂载的文件夹 mk…...
Java使用微信云服务HTTP API操作微信云开发数据库
可以直接用的工具类代码 package com.kstc.qgy.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.kstc.qgy.model.exception.WxException; import com.kstc.qgy.model.service.Limit; imp…...
Linux的权限
目录 1、用户分类 1.1 超级用户(root)和普通用户 1.2 普通<->超级 1.3 sudo 2、文件和目录的权限 2.1 chown&&chgrp 2.1.1 chown 2.1.2 chgrp 2.2 chmod 总结一下: 3、文件和目录的默认权限 4、共享文件 4.1 理解多用户隔离 4.2 /tmp/ 1…...
ACT游戏和MMORPG经济形态区别以及对经济循环的思考
对于原神的明日之后经济形态的不同解析 对于MMORPG游戏来说,如果采用开放市场经济的设计,以明日之后为例,系统产出端为采集、运营活动投放;玩家产出端为交易;消耗端为武器耐久的减少。但我好奇,在ACT游戏里…...
zynq7035的arm一秒钟最多可以支持触发多少次中断
一、概述 1.关于zynq7035的ARM处理器一秒能够支持多少次中断触发,需要综合来考虑。需要确定ARM处理器的参数,目前zynq7000系列,使用的双核Cortex-A9处理器。其中主频大概在500MHZ~1GHZ左右,不同的用户配置的主频可能稍微有差别。 …...
Spring MVC 拦截器教程
一、拦截器核心概念 1.1 拦截器 vs 过滤器 特性过滤器 (Filter)拦截器 (Interceptor)依赖关系Servlet容器Spring MVC框架作用范围所有Web请求Controller请求实现机制Java EE标准Java反射AOP生命周期服务器启动时初始化随Spring容器初始化功能场景字符编码、安全过滤权限校验、…...
【HPC存储性能测试】02-ior带宽性能测试
文章目录 一、前言二、软件安装1、安装依赖2、安装软件 三、参数说明1、mpirun参数2、ior参数 四、测试说明 一、前言 ior introduction | github hpc ior IOR 测试工具使用 POSIX、 MPIIO 或 HDF5接口对并行文件系统进行基准测试 通常使用IOR测试工具时,一般会配合…...
【RabbitMQ】保证消息不丢失
要确保 RabbitMQ 在消费者(Python 服务)重启或挂掉时消息不丢失,需结合 消息持久化、确认机制(ACK) 和 死信队列(DLX) 实现高可靠性: 1. 消息持久化(Durabilityÿ…...
算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲
目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…...
AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统
在当今社会,随着科技生产力的飞速发展,汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率,也为生活带来了诸多便利。然而,随着汽车保有量的不断增加,交通安全问题也日益凸显。疲劳驾驶和…...
HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)
HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析: 嵌入式操作系统特点是内核精简、专用性强、高实时性,而"功能强大"通常指的是通用操作系统&#x…...
【音视频】SDL事件
SDL 事件 函数 SDL_WaitEvent(): 等待一个事件SDL_PushEvent(): 发送一个事件SDL_PumpEvents(): 将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数之前,必须调用SDL_PumpEvents搜集键盘等事件…...
[特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统
📚目录 项目背景 技术栈总览 详细流程分析 3.1 Canal监听MySQL Binlog 3.2 MQ中转传递订单变化 3.3 Elasticsearch存储并查询附近订单 3.4 Redis高性能抢单Lua防止抢单冲突 3.5 XXL-Job定时任务处理 完整系统流程图 总结 一、项目背景 针对类似外卖、跑…...
FPGA基础之基础语法
一、基本模块结构 Verilog 代码以 模块(Module) 为单位,每个模块对应一个硬件功能单元(如逻辑门、寄存器等)。 基本格式: module 模块名 (// 输入输出端口声明input 端口1,input 端口2,output 端口3 );…...
影楼精修-皮肤瑕疵祛除算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; 顾名思义,皮肤瑕疵祛除旨在祛除人像照片皮肤区域的痘痘/斑点/痣/胎记等瑕疵;当前主流算法方案可分为传统图像处理方法和基于深度学习的方法,本文重点介绍基…...
2025蓝桥杯省赛网络安全组wp
文章目录 黑客密室逃脱ezEvtxflowzipEnigma星际xml解析器EBC-TrainAES-CBC 黑客密室逃脱 提示猜文件名,猜几个常见的,app.py读到源码 这里也是脑抽了一下,把密钥看成1236了。。。卡了五分钟左右,解出来的时候已经降到300多分了&a…...
【数据结构】·励志大厂版(复习+刷题):二叉树
前引:哈喽小伙伴们!经过几个月的间隔,还是逃脱不了再次复习的命运!!!本篇文章没有冗杂的闲话,全是干货教学,带你横扫二叉树的几种遍历,怎么前序、、中序、后续࿱…...
Spark-Streaming2
一.有状态转化操作 1. UpdateStateByKey UpdateStateByKey 原语用于记录历史记录,有时,我们需要在 DStream 中跨批次维护状态(例如流计算中累加 wordcount)。针对这种情况,updateStateByKey()为我们提供了对一个状态变量的访问&…...
《深入浅出Git:从版本控制原理到高效协作实战》
Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…...
内耗型选手如何能做到不内耗?
以下是针对「内耗型选手」的系统性解决方案,结合认知神经科学、行为心理学和效能管理理论,提供可落地的策略框架: 一、建立「内耗熵值」监测系统 1. 绘制内耗热力图 用时间轴记录每日内耗触发点: 时间段内耗场景能量损耗值&…...
pyspark将hive数据写入Excel文件中
不多解释直接上代码,少python包的自己直接下载 #!/usr/bin/env python # -*- encoding: utf-8 -*- from pyspark.sql import SparkSession import pandas as pd import os# 初始化 SparkSession 并启用 Hive 支持 spark SparkSession.builder \.appName("sel…...
Java大师成长计划之第5天:Java中的集合框架
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在 Java 编程中,集合框架…...
rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态
一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码,我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…...
数据结构【堆和链式结构】
堆和链式结构 1.堆的概念和定义1.1堆1.2二叉树的性质 2.堆的实现3.实现链式二叉树3.1链式二叉树的概念3.2前中后遍历3.3遍历(举例) 1.堆的概念和定义 1.1堆 定义:是特殊的二叉树 #mermaid-svg-vWPNPMGSLe0nGNcd {font-family:"trebuch…...
聊一聊自动化测试
目录 一、自动化测试的定义与核心价值 (一)什么是自动化测试 (二)核心价值:从人工到智能的跨越 二、自动化测试的发展阶段 (一)萌芽阶段(早期) (二&…...
vue2 开发一个实习管理系统电脑端-前端静态网站练习
为了快速的掌握vue2的所学习到的知识点,最近又使用vue2和element-ui 做了一个实习管理系统来巩固自己的前端技术,我觉得对于新手来说,多写代码,多找一些项目练习,是提供自己编程能力的一个很好的办法,这也是…...
【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
目录 1 Hive DML操作概述 2 数据加载操作 2.1 LOAD DATA语句 2.2 INSERT语句 3 数据导出操作 3.1 INSERT OVERWRITE DIRECTORY 3.2 使用HDFS命令导出 4 数据更新与删除 4.1 UPDATE语句 4.2 DELETE语句 5 MERGE操作(Hive 2.2) 6 性能优化建议…...
C++类和对象(上)
目录 类的定义类定义格式访问限定符类域 实例化实例化概念对象大小 this指针C和C语言实现Stack对比 类的定义 类定义格式 在下面的代码中,class为定义类的关键字,Stack为类的名字,{}中为类的主体, 注意类定义结束时后面分号不能省…...
LS2K0300龙芯开发板——智能车竞赛
开启 LS2K0300 调车之旅(自己写的自己慢慢更,可能写的不好欢迎指教) 欢迎大家一起讨论共同进步!逐飞科技针对 LS2K0300 MCU 开发的开源库,涵盖多种实用功能,助力竞赛与产品开发。以下是快速上手指南&#…...
电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)
引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…...
超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…...
JVM——垃圾收集策略
GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间,…...
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分:概率与统计基础 第2节:数字特征:期望值、方差、协方差与相关系数 一、期望值(Expected Value):…...
【MySQL】数据类型和表的操作
目录 一. 常用的数据类型 1.数值类型 1.1 整形类型 1.2 浮点型类型 2.字符串类型 char和varchar的区别 如何选择char和varchar 3.日期类型 4.二进制类型 二. 表的操作 1.查看所有表 2.表的创建 3.查看表的结构 4.表的修改 4.1 添加新的列 4.2 修改表中现有的列 4…...
Tauri打包时出现WixTools以及NSIS报错
前言 Tauri构建时会通过github下载Wix和NSIS,由于国内网络限制,所以这个过程基本都会失败,而且你无法使用挂代理的方式解决此问题,唯一的办法就是先下载对于的库,然后把库丢到对应的文件夹内来解决此问题。。。 文章目…...
Linux操作系统学习---进程地址空间
前言: 在学习c,c这些偏底层的语言时,我们常常会对一个变量取地址,一遍对他进行一系列的操作 . 可是 , 这真的是真实的物理地址吗 ? 其实并非如此 , 通过了解进程地址空间,我们就能解开这个困惑. 一、虚拟地址空间的概念: 同地址,不同值的代码示例: 下面通过创建子进程来看一个…...
docker compose -p的踩坑经验
刚才启动ragflow解析了几百个文件,再次启动登录时报错 没有这个账户,心疼token几秒。。。 再次回顾之前的启动方式和当前的启动方式,才发现有出入。 问题: 第一次启动sudo docker compose up -d 第二次启动sudo docker compose -…...
深入理解 Linux 用户管理:从基础到实践
在 Linux 操作系统中,用户管理是确保系统安全、合理分配资源的核心环节。无论是个人开发者搭建本地开发环境,还是运维人员管理企业级服务器集群,熟练掌握 Linux 用户管理都是一项必备技能。本文将从用户管理的基础概念出发,结合实…...
Go语言之路————指针、结构体、方法
Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go…...
【漫话机器学习系列】227.信息检索与数据挖掘中的常用加权技术(TF-IDF)
在自然语言处理(NLP)、信息检索(IR)和数据挖掘(DM)领域中,TF-IDF 是一种非常经典且常用的加权技术。 无论是搜索引擎排序、文本挖掘,还是特征工程,TF-IDF都扮演着重要角色…...
【音视频】FFmpeg过滤器框架分析
ffmpeg的filter⽤起来是和Gstreamer的plugin是⼀样的概念,通过avfilter_link,将各个创建好的filter按⾃⼰想要的次序链接到⼀起,然后avfilter_graph_config之后,就可以正常使⽤。 ⽐较常⽤的滤镜有:scale、trim、over…...
硬盘损坏数据恢复后对python程序的影响
最近硬盘突然间坏掉了,让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了: PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...
Azure Devops - 尝试一下在Pipeline中使用Self-hosted Windows agent
1.简单介绍 Azure Devops是微软提供的辅助软件的开发,测试,部署以及计划和进度跟踪的平台,通过Azure Devops可以使开发者,项目经理,运维人员在软件的整个生命周期中更紧密地合作,同时借助Continuous Integ…...
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小 前言一、分区管理,使用fdisk管理分区1.1 找到硬盘1.2 使用fdisk分区1.3 格式化分区1.4 挂载分区 二、创建逻辑卷,调整…...
详解 Unreal Engine(虚幻引擎)
详解 Unreal Engine(虚幻引擎) Unreal Engine(简称 UE)是由 Epic Games 开发的一款全球领先的实时渲染引擎,自 1998 年随首款游戏《Unreal》问世以来,已发展成为覆盖 游戏开发、影视制作、建筑可视化、汽车…...
【Linux网络】Http服务优化 - 增加请求后缀、状态码描述、重定向、自动跳转及注册多功能服务
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Docker compose 部署微服务项目(从0-1出发纯享版无废话)
目录 一.Docker安装 (1)安装依赖 (2)安装Docker (3)启动Docker服务 (4)系统配置 (5)镜像加速配置 (6)验证安装 二.编写Docke…...