-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDimensionalModeling.html
More file actions
694 lines (353 loc) · 51.5 KB
/
DimensionalModeling.html
File metadata and controls
694 lines (353 loc) · 51.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
<!DOCTYPE HTML>
<html lang="zh-hans" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>维度建模 · 大数据技术与算法Checklist</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="">
<meta name="generator" content="GitBook 3.2.3">
<meta name="author" content="powerlee">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search-pro/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-chapter-fold/chapter-fold.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-splitter/splitter.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-back-to-top-button/plugin.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-advanced-emoji/emoji-website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-insert-logo/plugin.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-pageview-count/plugin.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-flexible-alerts/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-katex-new/katex.min.css">
<link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-theme-comscore/test.css">
<link rel="stylesheet" href="styles/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="UserBehaviorsAnalysisPlatform.html" />
<link rel="prev" href="TimeSeries.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="输入并搜索" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="./">
<a href="./">
Introduction
</a>
</li>
<li class="chapter " data-level="1.2" data-path="GradientDescent.html">
<a href="GradientDescent.html">
梯度下降
</a>
</li>
<li class="chapter " data-level="1.3" data-path="LinearRegression.html">
<a href="LinearRegression.html">
线性回归
</a>
</li>
<li class="chapter " data-level="1.4" data-path="LogisticRegression.html">
<a href="LogisticRegression.html">
逻辑回归
</a>
</li>
<li class="chapter " data-level="1.5" data-path="DecisionTree.html">
<a href="DecisionTree.html">
决策树
</a>
</li>
<li class="chapter " data-level="1.6" data-path="ABTest.html">
<a href="ABTest.html">
A/B实验
</a>
</li>
<li class="chapter " data-level="1.7" data-path="TimeSeries.html">
<a href="TimeSeries.html">
时间序列
</a>
</li>
<li class="chapter active" data-level="1.8" data-path="DimensionalModeling.html">
<a href="DimensionalModeling.html">
维度建模
</a>
</li>
<li class="chapter " data-level="1.9" data-path="UserBehaviorsAnalysisPlatform.html">
<a href="UserBehaviorsAnalysisPlatform.html">
用户行为分析平台
</a>
</li>
<li class="chapter " data-level="1.10" data-path="SQLKeypoints.html">
<a href="SQLKeypoints.html">
SQL要点
</a>
</li>
<li class="chapter " data-level="1.11" data-path="SQLCases.html">
<a href="SQLCases.html">
SQL案例
</a>
</li>
<li class="chapter " data-level="1.12" data-path="Kafka.md">
<span>
Kafka
</a>
</li>
<li class="chapter " data-level="1.13" data-path="Spark.html">
<a href="Spark.html">
Spark
</a>
</li>
<li class="chapter " data-level="1.14" data-path="Flink.md">
<span>
Flink
</a>
</li>
<li class="chapter " data-level="1.15" data-path="ClickHouse.md">
<span>
ClickHouse
</a>
</li>
<li class="chapter " data-level="1.16" data-path="ProbabilityAndStatistics.html">
<a href="ProbabilityAndStatistics.html">
概率论与数理统计
</a>
</li>
<li class="chapter " data-level="1.17" data-path="PythonVirtualEnv.html">
<a href="PythonVirtualEnv.html">
Python虚拟环境
</a>
</li>
<li class="chapter " data-level="1.18" data-path="SparkLocalInstall.html">
<a href="SparkLocalInstall.html">
Spark本地安装部署
</a>
</li>
<li class="chapter " data-level="1.19" data-path="GitCheatSheet.html">
<a href="GitCheatSheet.html">
Git Cheat Sheet
</a>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
本书使用 GitBook 发布
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="." >维度建模</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<p>实际上不太喜欢研究数仓建模相关的理论。感觉像是在看英文语法书,一点也不Geek。但是真看起来,还是有一些要点值得被记录。</p>
<p>数据仓库领域数据建模通常采用<strong>维度建模</strong>。维度模型将复杂的业务通过<strong>事实</strong>和<strong>维度</strong>两个概念进行呈现。</p>
<p><strong>事实</strong>通常对应业务过程,就是具体的用户行为或者发生的事件。电商交易中的下单,取消订单,付款,退单等,都是业务过程。</p>
<p><strong>维度</strong>通常对应业务过程发生时所处的环境,就是行为或者事件相关的属性。比如下单这个业务过程包含了以下维度:Date(日期),Customer(顾客),Product(产品),Location(地区)等。</p>
<p>维度建模以<strong>数据分析</strong>作为出发点,为数据分析服务,因此它关注的重点是如何更快的完成需求分析,以及如何较好的提升大规模复杂查询的性能。</p>
<h3 id="事实表">事实表</h3>
<p>事实表是包含具体业务过程的表。包含与该业务过程有关的<strong>维度引用</strong>(维度表外键)以及该<strong>业务过程的度量</strong>(通常是数字类型字段)。</p>
<p>维度引用可以用来后续<strong>关联</strong>维度表获知更具体的维度信息。</p>
<p>事实表中也有可能<strong>不包含</strong>所谓的业务过程度量,比如关注一个作者,点赞一个帖子这种业务过程。而下单,通常会包含商品数量以及订单金额这种业务过程的度量。</p>
<p>事实表有三种类型:分别是<strong>事务型事实表</strong>、<strong>周期快照事实表</strong>和<strong>累积快照事实表</strong>,每种事实表都具有不同的特点和适用场景。</p>
<h4 id="事务型事实表">事务型事实表</h4>
<p>数仓中最常见的就是事务型事实表。用于分析与各业务过程相关的各项统计指标,由于其保存了最细粒度的记录,可以提供最大限度的灵活性,可以支持无法预期的各种细节层次的统计需求。</p>
<p>设计事务事实表时一般可遵循以下四个步骤:<strong>选择业务过程→声明粒度→确认维度→确认事实</strong></p>
<ol>
<li>选择一个个不可拆分的行为事件作为业务过程。例如电商交易中的下单,取消订单,付款,退单等。</li>
<li>声明粒度,一个业务过程也可能用不同的粒度来表示。比如下单可能包含多个商品,一个订单既可以用一行数据来表达,也可以被拆分成多条数据,每一条数据只记录一个商品。通常应尽可能选择最细粒度,以此来应各种细节程度的需求。</li>
<li>确认维度,确定事实表中应该包含哪些维度信息。维度的丰富程度就决定了维度模型能够支持的指标丰富程度。</li>
<li>确定事实。此处的<strong>事实</strong>一词,指的是每个业务过程的度量值。可以分为:<ul>
<li><strong>可加事实</strong>:比如订单金额,观看时长</li>
<li><strong>半可加事实</strong>:比如库存,余额。可以按照商品或者用户维度进行累加,但是不能按照时间维度进行累加。</li>
<li><strong>不可加事实</strong>:比如比率,转化率。不可加事实通常需要转化为可加事实,例如比率可转化为分子和分母。</li>
</ul>
</li>
</ol>
<h5 id="事务型事实表的不足">事务型事实表的不足</h5>
<p>理论上事务型事实表可以支撑与各业务过程相关的各种统计粒度的需求。但对于某些特定类型的需求,其逻辑可能会比较复杂,或者效率会比较低下。</p>
<ol>
<li><p>存量型指标</p>
<p>例如商品库存,账户余额等。以账户余额为例,事务型事实表记录的是用户账户每一笔支出和收入。假定现有一个需求,要求统计截至当日的各用户账户的余额。则需要扫描全量用户有史以来的全表数据聚合才能得到统计结果。可以看到事务型事实表对于这个需求而言并不是一个好的方案。</p>
</li>
<li><p>多事务关联统计</p>
<p>例如,现需要统计最近30天,用户下单到支付的时间间隔的平均值。统计思路应该是找到下单事务事实表和支付事务事实表,过滤出最近30天的记录,然后按照订单id对两张事实表进行关联,之后用支付时间减去下单时间,然后再求平均值。</p>
<p>逻辑上虽然并不复杂,但是其效率较低,应为下单事务事实表和支付事务事实表均为大表,大表join大表的操作应尽量避免。</p>
</li>
</ol>
<p>为了解决以上两个问题,引入<strong>周期快照事实表</strong>和<strong>累积快照事实表</strong>。</p>
<h4 id="周期快照事实表">周期快照事实表</h4>
<p>周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标。</p>
<p>对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求,而无需再对事务型事实表中大量的历史记录进行聚合了。</p>
<p>对于空气温度、行驶速度这些状态型指标,由于它们的值往往是连续的,我们无法捕获其变动的原子事务操作,所以无法使用事务型事实表统计此类需求。而只能定期对其进行采样,构建周期型快照事实表。</p>
<p>周期快照事实表设计的时候除了要考虑事务型事实表遵循的4个步骤,另外还需要考虑采样周期。通常采样周期选择<strong>”天“</strong>,以一天为周期进行快照。当然也有按周,按月,按季度的周期快照。</p>
<p>周期快照事实表和事务型事实表的一个关键区别在于<strong>密度</strong>。事务事实表本质是<strong>稀疏的</strong>,当天只有有业务过程发生才会记录相关的数据。而对于周期快照事实表,实际上是<strong>稠密的</strong>,即使当天没有业务过程发生,仍然会全量记录。比如余额数据,即使用户当天并未有收入或者支出相关的行为发生,周期快照事实表仍然会记录一条数据,即使是与前一天数据完全相同。</p>
<h5 id="注意事项:">注意事项:</h5>
<ol>
<li><p>事务与快照成对设计</p>
<p>通常在数仓维度建模的时候,为了更好的满足业务过程度量值的分析,往往要求事务型事实表和周期快照事实表成对设计。周期快照事实表主要是为了满足存量或状态型数据分析任务。</p>
</li>
<li><p>附加事实</p>
<p>快照事实表在确定状态度量时, 一般都是保存采样周期结束时的状态度量。但是也有分析需求需要关注上一个采样周期结束时的状态度量,而又不愿意多次使用快照事实表,因此一般在设计周期快照事实表时会附加一些上一个采样周期的状态度量。</p>
</li>
</ol>
<h4 id="累积快照事实表">累积快照事实表</h4>
<p>累计快照事实表是基于一个业务流程中的多个关键业务过程联合处理而构建的事实表,如交易流程中的下单、支付、发货、确认收货业务过程。</p>
<p>累积快照事实表通常具有多个日期字段,每个日期对应业务流程中的一个关键业务过程。</p>
<table>
<thead>
<tr>
<th style="text-align:left">订单ID</th>
<th style="text-align:left">用户ID</th>
<th style="text-align:left">下单日期</th>
<th style="text-align:left">支付日期</th>
<th style="text-align:left">发货日期</th>
<th style="text-align:left">确认收货日期</th>
<th style="text-align:left">订单金额</th>
<th style="text-align:left">支付金额</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1001</td>
<td style="text-align:left">0001</td>
<td style="text-align:left">2022-01-01</td>
<td style="text-align:left">2022-01-02</td>
<td style="text-align:left">2022-01-03</td>
<td style="text-align:left">2022-01-04</td>
<td style="text-align:left">2000</td>
<td style="text-align:left">2000</td>
</tr>
</tbody>
</table>
<p>累积快照事实表主要用于分析业务过程之间的时间间隔等需求。例如前文提到的用户下单到支付的平均时间间隔,使用累积快照事实表进行统计,就能避免两个事务事实表的关联操作,从而变得十分简单高效。</p>
<p>事务型事实表和周期快照事实表数据只存在插入操作,但是累计快照事实表不仅存在<strong>插入</strong>操作还存在<strong>更新</strong>操作。</p>
<p>在实际应用中,业务流程中所包含的业务过程可能并不固定,甚至相当复杂。仍以下单为例,可能并非是下单→支付→发货→收货这么简单直接。中间也可能包含退款、申诉、取消订单等等一些不确定的业务过程。所以在设计和使用累计快照事实表的时候需要格外小心。</p>
<h5 id="物理实现">物理实现</h5>
<p>第一种方式是全量表的形式。此全量表一般为日期分区表,每天的分区存储昨天的全量数据和当天的增量数据合并的结果,保证每条记录的状态最新。此种方式适用于全量数据较少的情况。如果数据量很大,此全量表数据量不断膨胀,存储了大量永远不再更新的历史数据,对ETL 和分析统计性能影响较大。</p>
<p>第二种方式是全量表的变化形式。此种方式主要针对事实表数据量很大的情况。较短生命周期的业务实体一般从产生到消亡都有一定的时间间隔,可以测算此时间间隔,或者根据商业用户的需求确定一个相对较大的时间间隔。比如针对交易订单,我们以200 天作为订单从产生到消亡的最大间隔。设计最近200 天的交易订单累积快照事实表,每天的分区存储最近200 天的交易订单;而200 天之前的订单则按照gmt_create 创建分区存储在归档表中。此方式存在的一个问题是200 天的全量表根据商业需求需要保留多天的分区数据,而由于数据量较大,存储消耗较大。</p>
<p>第三种方式是以业务实体的结束时间分区。每天的分区存放当天结束的数据,设计一个时间非常大的分区,比如3000-12-31 ,存放截至当前未结束的数据。由于每天将当天结束的数据归档至当天分区中,时间非常大的分区数据量不会很大, ETL 性能较好;并且无存储的浪费, 对于业务实体的某具体实例,在该表的全量数据中唯一。比如对于交易订单,在交易累积快照事实表中唯一。</p>
<p>针对第三种方式,可能存在极特殊情况,即业务系统无法标识业务实体的结束时间:</p>
<ol>
<li>使用相关业务系统的业务实体的结束标志作为此业务系统的结束标志。比如针对物流订单,可以使用交易订单。理论上, 交易订单完结了,则物流订单已经完结。</li>
<li>和前端业务系统确定口径或使用前端归档策略。累积快照事实表针对业务实体一般是具有较短生命周期的,和前端业务系统确定口径,确定从业务实体的产生到消亡的最大间隔。</li>
</ol>
<h3 id="维度表">维度表</h3>
<h4 id="规范化与反规范化">规范化与反规范化</h4>
<p><strong>规范化</strong>是指使用一系列范式设计数据库的过程,其目的是减少数据冗余,增强数据的一致性。通常情况下,规范化之后,一张表的字段会拆分到多张表。</p>
<p><strong>反规范化</strong>是指将多张表的数据冗余到一张表,其目的是减少join操作,提高查询性能。在设计维度表时,如果对其进行规范化,得到的维度模型称为雪花模型,如果对其进行反规范化,得到的模型称为星型模型。</p>
<p>数据仓库系统的主要目的是用于数据分析和统计,所以是否方便用户进行统计分析决定了模型的优劣。采用雪花模型,用户在统计分析的过程中需要大量的关联操作,使用复杂度高,同时查询性能很差,而采用星型模型,则方便、易用且性能好。所以出于易用性和性能的考虑,维度表在设计时一般存在大量反规范化。</p>
<h4 id="维度变化">维度变化</h4>
<p>维度属性通常不是静态的,而是会随时间变化的,数据仓库的一个重要特点就是反映历史的变化,所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态,通常有以下两种做法,分别是<strong>全量快照表</strong>和<strong>拉链表</strong>。</p>
<h5 id="全量快照表">全量快照表</h5>
<p>离线数据仓库的计算周期通常为每天一次,所以可以每天保存一份全量的维度数据。这种方式的优点和缺点都很明显。<strong>优点</strong>是简单而有效,开发和维护成本低,且方便理解和使用。<strong>缺点</strong>是浪费存储空间,尤其是当数据的变化比例比较低时。</p>
<h5 id="拉链表">拉链表</h5>
<p>拉链表,记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期放入生效开始日期。如果当前信息至今有效,在生效结束日期中填入一个极大值(如9999-12-31 )。</p>
<table>
<thead>
<tr>
<th>用户ID</th>
<th><strong>姓名</strong></th>
<th><strong>手机号码</strong></th>
<th><strong>开始日期</strong></th>
<th><strong>结束日期</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>0001</td>
<td>李四</td>
<td>136<em>**</em>1111</td>
<td>2022-01-01</td>
<td>2022-01-02</td>
</tr>
<tr>
<td>0001</td>
<td>李四</td>
<td>137<em>**</em>2222</td>
<td>2022-01-03</td>
<td>2022-01-09</td>
</tr>
<tr>
<td>0001</td>
<td>李四</td>
<td>138<em>**</em>1234</td>
<td>2022-01-10</td>
<td>9999-12-31</td>
</tr>
</tbody>
</table>
<p>拉链表适合于:数据会发生变化,但是变化频率并不高的维度(即:缓慢变化维) 。比如:用户信息会发生变化,但是每天变化的比例不高。如果数据量有一定规模,按照每日全量的方式保存效率很低。 比如:1亿用户*365天,每天做一份全量用户信息表效率就会很低。</p>
<p>拉链表在具体使用过程中可以通过:<strong>生效开始日期<=某个日期 且 生效结束日期>=某个日期</strong> ,得到某个时间点的数据全量切片:</p>
<pre class="language-"><code class="lang-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> user_info <span class="token keyword">WHERE</span> start_date <span class="token operator"><=</span> <span class="token string">'2022-01-01'</span> <span class="token operator">AND</span> end_date <span class="token operator">>=</span> <span class="token string">'2022-01-01'</span>
</code></pre>
<div id="gitalk-container"></div>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="TimeSeries.html" class="navigation navigation-prev " aria-label="Previous page: 时间序列">
<i class="fa fa-angle-left"></i>
</a>
<a href="UserBehaviorsAnalysisPlatform.html" class="navigation navigation-next " aria-label="Next page: 用户行为分析平台">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"维度建模","level":"1.8","depth":1,"next":{"title":"用户行为分析平台","level":"1.9","depth":1,"path":"UserBehaviorsAnalysisPlatform.md","ref":"UserBehaviorsAnalysisPlatform.md","articles":[]},"previous":{"title":"时间序列","level":"1.7","depth":1,"path":"TimeSeries.md","ref":"TimeSeries.md","articles":[]},"dir":"ltr"},"config":{"plugins":["-lunr","-search","search-pro","-code","-codeline","-highlight","prism","expandable-chapters","chapter-fold","splitter","back-to-top-button","advanced-emoji","hide-element","insert-logo","custom-favicon","pageview-count","-sharing","sharing-plus","flexible-alerts","katex-new","mygitalk","theme-comscore","livereload"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"chapter-fold":{},"prism":{},"styles":{"website":"website.css","ebook":"ebook.css","pdf":"pdf.css","mobi":"ebook.css","epub":"ebook.css"},"katex-new":{},"livereload":{},"splitter":{},"search-pro":{},"sharing-plus":{"qq":false,"all":["facebook","google","twitter","instapaper","linkedin","pocket","stumbleupon"],"douban":false,"facebook":true,"weibo":false,"instapaper":false,"whatsapp":false,"hatenaBookmark":false,"twitter":true,"messenger":false,"line":false,"vk":false,"pocket":true,"google":false,"viber":false,"stumbleupon":false,"qzone":false,"linkedin":false},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"favicon":"pics/logo.ico","theme-comscore":{},"back-to-top-button":{},"pageview-count":{},"custom-favicon":{},"flexible-alerts":{"style":"callout","note":{"label":"Note","icon":"fa fa-info-circle","className":"info"},"tip":{"label":"Tip","icon":"fa fa-lightbulb-o","className":"tip"},"warning":{"label":"Warning","icon":"fa fa-exclamation-triangle","className":"warning"},"danger":{"label":"Attention","icon":"fa fa-ban","className":"danger"}},"mygitalk":{"flipMoveOptions":{},"clientID":"c623ce11cb38fa65e5f0","number":-1,"perPage":10,"proxy":"https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_token","admin":["powerAmore"],"createIssueManually":false,"distractionFreeMode":false,"repo":"DataSciChecklist","owner":"powerAmore","enableHotKey":true,"clientSecret":"09a234dcf2ca63822ea9858aa00245147624e61d","pagerDirection":"last","labels":["Gitalk"]},"advanced-emoji":{"embedEmojis":false},"sharing":{"facebook":true,"twitter":true,"all":["douban","facebook","google","twitter","weibo","qq","whatsapp"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"insert-logo":{"url":"pics/logo.jpeg","style":"background: none; max-height: 30px; min-height: 30px"},"expandable-chapters":{}},"theme":"default","author":"powerlee","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"大数据技术与算法Checklist","language":"zh-hans","links":{},"gitbook":"*","description":"大数据技术与算法Checklist"},"file":{"path":"DimensionalModeling.md","mtime":"2023-01-26T08:41:25.821Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2023-02-04T03:57:06.860Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
<script src="gitbook/gitbook-plugin-search-pro/search.js"></script>
<script src="gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script>
<script src="gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
<script src="gitbook/gitbook-plugin-splitter/splitter.js"></script>
<script src="gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
<script src="gitbook/gitbook-plugin-hide-element/plugin.js"></script>
<script src="gitbook/gitbook-plugin-insert-logo/plugin.js"></script>
<script src="gitbook/gitbook-plugin-pageview-count/plugin.js"></script>
<script src="gitbook/gitbook-plugin-sharing-plus/buttons.js"></script>
<script src="gitbook/gitbook-plugin-flexible-alerts/plugin.js"></script>
<script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script>
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>
<script src="gitbook/gitbook-plugin-mygitalk/mygitalk.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
<script src="gitbook/gitbook-plugin-theme-comscore/test.js"></script>
</body>
</html>