尚硅谷大数据项目《线上问诊之离线数仓》离线数据仓库项目实战教程

91 阅读3分钟

尚硅谷大数据项目《线上问诊之离线数仓》实战教程解析

尚硅谷推出的《线上问诊之离线数仓》实战教程,以真实医疗问诊场景为依托,通过系统化的技术栈整合与分层建模实践,为大数据开发者提供了企业级数仓开发的完整解决方案。本文将从技术架构、核心模块、实战代码及行业价值四个维度展开深度解析。

一、全链路技术架构设计

项目采用"采集-存储-计算-调度-可视化"五层架构,覆盖数据全生命周期管理:

  1. 数据采集层:集成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}
  1. 存储计算层:基于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;
  1. 调度管理层:使用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维度建模方法论,构建四层数据仓库体系:

  1. 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}
  1. 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;
  1. 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;

三、行业价值与创新

该项目的实践价值体现在三个方面:

  1. 医疗业务深度适配:针对处方开单、支付成功等20+医疗业务事件设计专用事实表,解决传统数仓难以处理的多业务状态跟踪问题
  2. 性能优化体系:通过HDFS小文件合并、Hive参数调优(如mapreduce.job.reduces=200)、Spark内存管理(spark.executor.memoryOverhead=2g)等手段,实现PB级数据日处理能力
  3. 可视化闭环:集成SuperSet实现交互式分析,构建包含"医院科室运营看板"、"医生绩效评估"等15个可视化模块的决策支持系统

项目完整代码库包含200+个可复用脚本,涵盖从数据采集到可视化展示的全流程,其设计理念已被国内多家三甲医院HIS系统升级项目采纳,成为医疗大数据领域的标杆实践。