Skip to content

Commit 73ac441

Browse files
committed
docs:数仓专栏大纲
1 parent 67c4d47 commit 73ac441

File tree

4 files changed

+1196
-8
lines changed

4 files changed

+1196
-8
lines changed

docs/.vuepress/config.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ module.exports = {
177177
{
178178
text: '数据仓库',
179179
items: [{
180-
text: '00-数仓分层和数仓建模',
181-
link: '/md/bigdata/数仓分层和数仓建模.md'
180+
text: 'Spark+ClickHouse实战企业级数据仓库专栏',
181+
link: '/md/bigdata/Spark+ClickHouse实战企业级数据仓库专栏.md'
182182
}, ]
183183
},
184184
]
@@ -304,10 +304,19 @@ module.exports = {
304304
},
305305
{
306306
text: '云原生',
307-
items: [{
308-
text: '00-Docker基础命令大全',
307+
items: [
308+
{
309+
text: 'Docker',
309310
link: '/md/docker/00-Docker基础命令大全.md'
310-
}]
311+
},
312+
313+
{
314+
text: 'k8s',
315+
items: [{
316+
text: 'kubectl命令',
317+
link: '/md/k8s/kubectl命令.md'
318+
}, ]
319+
},]
311320
},
312321
{
313322
text: '计基',
@@ -494,10 +503,12 @@ module.exports = {
494503
collapsable: false,
495504
sidebarDepth: 0,
496505
children: [
497-
"数仓业务调研.md",
498-
"数仓分层和数仓建模.md",
506+
"数仓业务调研",
507+
"数仓分层和数仓建模",
508+
"轻松驾驭Hive数仓",
509+
"数仓开发之ODS层",
499510
"数仓开发之DIM层",
500-
"轻松驾驭Hive数仓.md",
511+
501512
]
502513
},
503514

@@ -619,6 +630,14 @@ module.exports = {
619630
"01-标准化打包技术.md",
620631
]
621632
}],
633+
"/md/k8s/": [{
634+
title: "Kubernetes",
635+
collapsable: false,
636+
sidebarDepth: 0,
637+
children: [
638+
"kubectl命令",
639+
]
640+
}],
622641
"/md/netty/base": [{
623642
title: "Netty",
624643
collapsable: false,
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Spark+ClickHouse实战企业级数据仓库专栏
2+
3+
## 1 就业前景广
4+
5+
数据仓库被广泛应用于互联网业务中,就业前景极为广阔
6+
7+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240313132017997.png)
8+
9+
## 2 热门技术
10+
11+
结合热门技术,实战企业级数仓项目
12+
13+
轻松掌握高薪数据工程师必备技能。全方位提升项目开发经验,上手 ClickHouse+Spark,实现个人的成长蜕变
14+
15+
### 2.1 深度实战 数据仓库 模型设计与调优
16+
17+
- 数仓整体分层设计方案
18+
- 维度表模型设计
19+
- 面向业务过程的事实表建模
20+
- 面向分析主题的事实表建模
21+
- 千万级数据分析与调优
22+
- 维度表存储选型
23+
- BI工具 Superset/Granfana的数据展示
24+
25+
### 2.2 系统掌握 ClickHouse 核心技能与生产实践
26+
27+
- 表引擎的使用和优化
28+
- ClickHouse 的 SQL优化
29+
- 搭建分布式集群
30+
- ClickHouse 监控
31+
- Clickhouse 字典优化
32+
- 负载均衡与高可用
33+
- 生产实践优化
34+
35+
### 2.3 充分提升 Spark/ClickHouse 项目开发与实用操作
36+
37+
- Spark 自定义 ClickHouse 外部数据源
38+
- Spark 的数据处理与调优
39+
- Spark 自定义本地分片写入策略
40+
- Spark 源码、开源组件源码二次开发
41+
- Spark 参数调优
42+
43+
## 3 生产实践案例
44+
45+
通过更贴近生产实践的案例,掌握多种实用方案,满足复杂业务需求
46+
47+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240313133151521.png)
48+
49+
## 4 遵照数仓分层模型
50+
51+
实战数据处理的各个环节,构建实用技术体系
52+
53+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240313133220859.png)
54+
55+
## FAQ
56+
57+
Q:是CDH项目吗?
58+
59+
A:Hadoop生态相关的环境是以Apache Hadoop + Apache Spark构建, 专栏源码兼容CDH版本的Hadoop和Spark。
60+
61+
Q:项目的环境是自己进行搭建吗?还是老师提供
62+
63+
A:手把手带领大家,从0开始搭建环境。 同时提供了开箱即用的虚拟机文件,可直接导入虚拟机用于开发。
64+
65+
Q:是实时数仓吗?
66+
67+
A:如果同学指的是,基于流处理和批处理的维度区分,专栏属离线数仓;如果基于响应实时性维度,可以做到在几分钟之内, 算准实时。
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
# 数仓开发之ODS层
2+
3+
优秀可靠的数仓体系,需要良好的数据分层结构。合理的分层,能够使数据体系更加清晰,使复杂问题得以简化。以下是该项目的分层规划。
4+
5+
## 1 设计要点
6+
7+
(1)ODS层的表结构设计依托于从业务系统同步过来的数据结构
8+
9+
(2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip
10+
11+
(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。
12+
13+
## 2 相关表
14+
15+
### 2.1 整车日志表(增量日志表)
16+
17+
```sql
18+
19+
create external table ods_car_data_inc
20+
21+
(
22+
23+
`vin` string comment '汽车唯一ID',
24+
25+
`car_status` int comment '车辆状态',
26+
27+
`charge_status` int comment '充电状态',
28+
29+
`execution_mode` int comment '运行模式',
30+
31+
`velocity` int comment '车速',
32+
33+
`mileage` int comment '里程',
34+
35+
`voltage` int comment '总电压',
36+
37+
`electric_current` int comment '总电流',
38+
39+
`soc` int comment 'SOC',
40+
41+
`dc_status` int comment 'DC-DC状态',
42+
43+
`gear` int comment '挡位',
44+
45+
`insulation_resistance` int comment '绝缘电阻',
46+
47+
`motor_count` int comment '驱动电机个数',
48+
49+
`motor_list` array<struct<`id` :int, `status` :int, `rev` :int, `torque` :int,
50+
51+
`controller_temperature` :int, `temperature` :int,
52+
53+
`voltage`
54+
55+
​ :int, `electric_current` :int>> comment '驱动电机列表',
56+
57+
`fuel_cell_voltage` int comment '燃料电池电压',
58+
59+
`fuel_cell_current` int comment '燃料电池电流',
60+
61+
`fuel_cell_consume_rate` int comment '燃料消耗率',
62+
63+
`fuel_cell_temperature_probe_count` int comment '燃料电池温度探针总数',
64+
65+
`fuel_cell_temperature` int comment '燃料电池温度值',
66+
67+
`fuel_cell_max_temperature` int comment '氢系统中最高温度',
68+
69+
`fuel_cell_max_temperature_probe_id` int comment '氢系统中最高温度探针号',
70+
71+
`fuel_cell_max_hydrogen_consistency` int comment '氢气最高浓度',
72+
73+
`fuel_cell_max_hydrogen_consistency_probe_id` int comment '氢气最高浓度传感器代号',
74+
75+
`fuel_cell_max_hydrogen_pressure` int comment '氢气最高压力',
76+
77+
`fuel_cell_max_hydrogen_pressure_probe_id` int comment '氢气最高压力传感器代号',
78+
79+
`fuel_cell_dc_status` int comment '高压DC-DC状态',
80+
81+
`engine_status` int comment '发动机状态',
82+
83+
`crankshaft_speed` int comment '曲轴转速',
84+
85+
`fuel_consume_rate` int comment '燃料消耗率',
86+
87+
`max_voltage_battery_pack_id` int comment '最高电压电池子系统号',
88+
89+
`max_voltage_battery_id` int comment '最高电压电池单体代号',
90+
91+
`max_voltage` int comment '电池单体电压最高值',
92+
93+
`min_temperature_subsystem_id` int comment '最低电压电池子系统号',
94+
95+
`min_voltage_battery_id` int comment '最低电压电池单体代号',
96+
97+
`min_voltage` int comment '电池单体电压最低值',
98+
99+
`max_temperature_subsystem_id` int comment '最高温度子系统号',
100+
101+
`max_temperature_probe_id` int comment '最高温度探针号',
102+
103+
`max_temperature` int comment '最高温度值',
104+
105+
`min_voltage_battery_pack_id` int comment '最低温度子系统号',
106+
107+
`min_temperature_probe_id` int comment '最低温度探针号',
108+
109+
`min_temperature` int comment '最低温度值',
110+
111+
`alarm_level` int comment '报警级别',
112+
113+
`alarm_sign` int comment '通用报警标志',
114+
115+
`custom_battery_alarm_count` int comment '可充电储能装置故障总数N1',
116+
117+
`custom_battery_alarm_list` array<int> comment '可充电储能装置故障代码列表',
118+
119+
`custom_motor_alarm_count` int comment '驱动电机故障总数N2',
120+
121+
`custom_motor_alarm_list` array<int> comment '驱动电机故障代码列表',
122+
123+
`custom_engine_alarm_count` int comment '发动机故障总数N3',
124+
125+
`custom_engine_alarm_list` array<int> comment '发动机故障代码列表',
126+
127+
`other_alarm_count` int comment '其他故障总数N4',
128+
129+
`other_alarm_list` array<int> comment '其他故障代码列表',
130+
131+
`battery_count` int comment '单体电池总数',
132+
133+
`battery_pack_count` int comment '单体电池包总数',
134+
135+
`battery_voltages` array<int> comment '单体电池电压值列表',
136+
137+
`battery_temperature_probe_count` int comment '单体电池温度探针总数',
138+
139+
`battery_pack_temperature_count` int comment '单体电池包总数',
140+
141+
`battery_temperatures` array<int> comment '单体电池温度值列表',
142+
143+
\`timestamp\` bigint comment '日志采集时间'
144+
145+
)
146+
147+
comment '整车日志表'
148+
149+
partitioned by (`dt` string comment '统计日期')
150+
151+
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
152+
153+
location '/warehouse/car_data/ods/ods_car_data_inc';
154+
```
155+
156+
### 2.2 汽车信息表(全量表)
157+
158+
```sql
159+
drop table if exists ods_car_info_full;
160+
CREATE EXTERNAL TABLE IF NOT EXISTS ods_car_info_full (
161+
`id` string COMMENT '车辆唯一编码',
162+
`type_id` string COMMENT '车型ID',
163+
`type` string COMMENT '车型',
164+
`sale_type` string COMMENT '销售车型',
165+
`trademark` string COMMENT '品牌',
166+
`company` string COMMENT '厂商',
167+
`seating_capacity` int COMMENT '准载人数',
168+
`power_type` string COMMENT '车辆动力类型',
169+
`charge_type` string COMMENT '车辆支持充电类型',
170+
`category` string COMMENT '车辆分类',
171+
`weight_kg` int COMMENT '总质量(kg)',
172+
`warranty` string COMMENT '整车质保期(年/万公里)'
173+
)
174+
COMMENT '整车信息表'
175+
PARTITIONED BY (dt string COMMENT '统计日期')
176+
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
177+
LOCATION '/warehouse/car_data/ods/ods_car_info_full';
178+
```
179+
180+
## 3 数据装载
181+
182+
```shell
183+
#!/bin/bash
184+
185+
APP='car_data'
186+
187+
# 判断第二个参数是否填写 如果填写使用作为日期 如果没有填写 默认使用昨天作为日期
188+
if [ -n "$2" ]; then
189+
# statements
190+
do_date=$2
191+
else
192+
do_date=`date -d '-1 day' +%F`
193+
fi
194+
195+
case "$1" in
196+
"ods_car_data_inc")
197+
hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');"
198+
;;
199+
"ods_car_info_full")
200+
hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');"
201+
;;
202+
"all")
203+
hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');"
204+
hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');"
205+
;;
206+
*)
207+
echo "Usage: $0 {ods_car_data_inc|ods_car_info_full|all}"
208+
;;
209+
esac
210+
```
211+
212+
确保在Hive加载数据之前,数据文件已经存在于对应的HDFS路径中,且表的分区字段名是正确的。在运行脚本之前,授予其执行权限,使用以下命令。然后根据你的需求执行脚本:
213+
214+
```bash
215+
./your_script_name.sh ods_car_data_inc
216+
./your_script_name.sh ods_car_info_full
217+
218+
./your_script_name.sh all 2024-03-11
219+
```
220+
221+
写好脚本,以后放入 dophinschedule 调度器每天跑就行。实现将 HDFS 数据载入 ods表 中。

0 commit comments

Comments
 (0)