尚硅谷大数据项目《线上问诊之离线数仓》实战教程解析
尚硅谷推出的《线上问诊之离线数仓》实战教程,以真实医疗问诊场景为依托,通过系统化的技术栈整合与分层建模实践,为大数据开发者提供了企业级数仓开发的完整解决方案。本文将从技术架构、核心模块、实战代码及行业价值四个维度展开深度解析。
一、全链路技术架构设计
项目采用"采集-存储-计算-调度-可视化"五层架构,覆盖数据全生命周期管理:
- 数据采集层:集成Flume日志采集、Maxwell MySQL变更日志捕获、DataX全量/增量同步三大工具链。例如通过Maxwell实现MySQL到Kafka的实时数据流传输,配置示例如下:
json
1{
2 "host": "mysql-master",
3 "user": "maxwell",
4 "password": "password",
5 "kafka.bootstrap.servers": "kafka1:9092",
6 "kafka_topic": "medical_binlog",
7 "filter": "exclude_columns=*.password"
8}
- 存储计算层:基于Hadoop HDFS构建分布式存储,采用Hive on Spark引擎实现SQL化数据分析。针对医疗JSON数据设计复杂类型建表语句:
sql
1CREATE TABLE ods_patient_records (
2 id STRING,
3 visit_info STRUCT<department:STRING,doctor_id:STRING>,
4 diagnosis ARRAY<STRING>
5)
6ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
7STORED AS TEXTFILE;
- 调度管理层:使用DolphinScheduler实现工作流自动化,通过DAG可视化编排数据同步、ETL转换、指标计算等任务。典型调度配置包含参数传递机制:
xml
1<workflow>
2 <task name="data_sync">
3 <parameter name="start_date" value="${sys_date-1d}"/>
4 <parameter name="end_date" value="${sys_date}"/>
5 </task>
6 <task name="dwd_processing" depends="data_sync">
7 <parameter name="input_path" value="${data_sync.output_path}"/>
8 </task>
9</workflow>
二、核心建模实践
项目严格遵循Kimball维度建模方法论,构建四层数据仓库体系:
- ODS层:原始数据镜像层,保留业务系统数据结构。针对医疗业务特点设计增量同步策略,例如通过DataX的
querySql模式实现每日增量抽取:
json
1{
2 "job": {
3 "content": [{
4 "reader": {
5 "name": "mysqlreader",
6 "parameter": {
7 "connection": [{...}],
8 "query": "SELECT * FROM patient_records WHERE create_time >= '${start_date}' AND create_time < '${end_date}'"
9 }
10 },
11 "writer": {
12 "name": "hdfswriter",
13 "parameter": {...}
14 }
15 }]
16 }
17}
- DIM层:维度建模核心层,包含医生、患者、药品等维度表。针对多值维度问题设计拉链表处理历史变更,示例SQL实现:
sql
1-- 创建拉链表
2CREATE TABLE dim_doctor_history (
3 doctor_id STRING,
4 name STRING,
5 department STRING,
6 start_date DATE,
7 end_date DATE,
8 is_current BOOLEAN
9) PARTITIONED BY (dt STRING);
10
11-- 更新拉链表逻辑
12INSERT OVERWRITE TABLE dim_doctor_history PARTITION(dt='${biz_date}')
13SELECT
14 doctor_id, name, department,
15 CASE WHEN is_current THEN '9999-12-31' ELSE end_date END,
16 '9999-12-31',
17 TRUE
18FROM dim_doctor_history
19WHERE dt='${prev_date}' AND is_current=TRUE
20UNION ALL
21SELECT
22 new.doctor_id, new.name, new.department,
23 '${biz_date}', '9999-12-31', TRUE
24FROM staging_doctor new
25LEFT JOIN dim_doctor_history old ON new.doctor_id=old.doctor_id AND old.dt='${prev_date}' AND old.is_current=TRUE
26WHERE old.doctor_id IS NULL;
- DWS层:汇总事实表层,构建医疗业务主题域指标。例如设计"医院科室问诊量日汇总表":
sql
1CREATE TABLE dws_dept_daily_stats (
2 hospital_id STRING,
3 dept_id STRING,
4 visit_count BIGINT,
5 payment_amount DECIMAL(18,2),
6 stat_date DATE
7) PARTITIONED BY (dt STRING)
8STORED AS ORC;
9
10-- 每日聚合计算
11INSERT OVERWRITE TABLE dws_dept_daily_stats PARTITION(dt='${biz_date}')
12SELECT
13 f.hospital_id, f.dept_id,
14 COUNT(DISTINCT f.visit_id) as visit_count,
15 SUM(p.amount) as payment_amount,
16 '${biz_date}' as stat_date
17FROM dwd_visit_fact f
18JOIN dwd_payment_fact p ON f.visit_id=p.visit_id
19WHERE f.dt='${biz_date}' AND p.dt='${biz_date}'
20GROUP BY f.hospital_id, f.dept_id;
三、行业价值与创新
该项目的实践价值体现在三个方面:
- 医疗业务深度适配:针对处方开单、支付成功等20+医疗业务事件设计专用事实表,解决传统数仓难以处理的多业务状态跟踪问题
- 性能优化体系:通过HDFS小文件合并、Hive参数调优(如
mapreduce.job.reduces=200)、Spark内存管理(spark.executor.memoryOverhead=2g)等手段,实现PB级数据日处理能力 - 可视化闭环:集成SuperSet实现交互式分析,构建包含"医院科室运营看板"、"医生绩效评估"等15个可视化模块的决策支持系统
项目完整代码库包含200+个可复用脚本,涵盖从数据采集到可视化展示的全流程,其设计理念已被国内多家三甲医院HIS系统升级项目采纳,成为医疗大数据领域的标杆实践。