├── .gitignore
├── README.MD
├── collections
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── gmall
│ │ └── data
│ │ └── collection
│ │ ├── canal
│ │ └── SimpleCanalClientExample.java
│ │ ├── flow
│ │ ├── Csv2JsonDemo02.java
│ │ ├── Csv2JsonDemo03.java
│ │ ├── CsvToJsonDemo.java
│ │ ├── GenLogData.scala
│ │ └── SparkDemo.scala
│ │ └── pojo
│ │ └── OdsScEvent.java
│ └── resources
│ ├── canal
│ └── conf
│ │ ├── canal.properties
│ │ └── example
│ │ └── instance.properties
│ ├── log4j.properties
│ └── sales
│ ├── application.properties
│ ├── gmall2020-mock-db-2020-11-27.jar
│ ├── gmall2020_12_08.sql
│ └── start_data.sh
├── common
├── pom.xml
└── src
│ ├── main
│ ├── resources
│ │ └── application.properties
│ └── scala
│ │ └── com
│ │ └── gmall
│ │ └── data
│ │ └── common
│ │ ├── config
│ │ ├── Config.scala
│ │ ├── KafkaConfig.scala
│ │ └── RedisConfig.scala
│ │ ├── entity
│ │ ├── dim
│ │ │ └── DimUserInfo.scala
│ │ ├── dwd
│ │ │ └── DwdOrderDetail.scala
│ │ └── ods
│ │ │ ├── Model.scala
│ │ │ ├── OdsModel.scala
│ │ │ ├── SqlType.scala
│ │ │ ├── flow
│ │ │ ├── DwdBaseLog.scala
│ │ │ ├── DwdDisplayLog.scala
│ │ │ ├── DwdPageLog.scala
│ │ │ ├── DwdStartLog.scala
│ │ │ ├── DwdUserBaseLog.scala
│ │ │ ├── OdsBaseLog.scala
│ │ │ └── OdsUserActionLog.scala
│ │ │ └── gmall2021
│ │ │ ├── ActivityInfo.scala
│ │ │ ├── ActivityRule.scala
│ │ │ ├── ActivitySku.scala
│ │ │ ├── BaseAttrInfo.scala
│ │ │ ├── BaseAttrValue.scala
│ │ │ ├── BaseCategory1.scala
│ │ │ ├── BaseCategory2.scala
│ │ │ ├── BaseCategory3.scala
│ │ │ ├── BaseCategoryView.scala
│ │ │ ├── BaseDic.scala
│ │ │ ├── BaseFrontendParam.scala
│ │ │ ├── BaseProvince.scala
│ │ │ ├── BaseRegion.scala
│ │ │ ├── BaseSaleAttr.scala
│ │ │ ├── BaseTrademark.scala
│ │ │ ├── CartInfo.scala
│ │ │ ├── CmsBanner.scala
│ │ │ ├── CommentInfo.scala
│ │ │ ├── CouponInfo.scala
│ │ │ ├── CouponRange.scala
│ │ │ ├── CouponUse.scala
│ │ │ ├── FavorInfo.scala
│ │ │ ├── FinancialSkuCost.scala
│ │ │ ├── OrderDetail.scala
│ │ │ ├── OrderDetailActivity.scala
│ │ │ ├── OrderDetailCoupon.scala
│ │ │ ├── OrderInfo.scala
│ │ │ ├── OrderRefundInfo.scala
│ │ │ ├── OrderStatusLog.scala
│ │ │ ├── PaymentInfo.scala
│ │ │ ├── RefundPayment.scala
│ │ │ ├── SeckillGoods.scala
│ │ │ ├── SkuAttrValue.scala
│ │ │ ├── SkuImage.scala
│ │ │ ├── SkuInfo.scala
│ │ │ ├── SkuSaleAttrValue.scala
│ │ │ ├── SpuImage.scala
│ │ │ ├── SpuInfo.scala
│ │ │ ├── SpuPoster.scala
│ │ │ ├── SpuSaleAttr.scala
│ │ │ ├── SpuSaleAttrValue.scala
│ │ │ ├── UserAddress.scala
│ │ │ ├── UserInfo.scala
│ │ │ ├── WareInfo.scala
│ │ │ ├── WareOrderTask.scala
│ │ │ ├── WareOrderTaskDetail.scala
│ │ │ └── WareSku.scala
│ │ ├── sink
│ │ ├── SinkFactory.scala
│ │ └── kafka
│ │ │ └── EventKafkaSerializationSchema.scala
│ │ ├── source
│ │ ├── SourceFactory.scala
│ │ └── binlog
│ │ │ └── OdsModelFactory.scala
│ │ ├── transform
│ │ ├── Convert.scala
│ │ ├── Format.scala
│ │ ├── Merger.scala
│ │ └── Sink.scala
│ │ └── utils
│ │ ├── CacheUtil.scala
│ │ ├── Constants.scala
│ │ ├── GsonUtil.scala
│ │ ├── HBaseUtil.scala
│ │ ├── JedisConnectionPool.scala
│ │ ├── JedisWrapper.scala
│ │ ├── LoggerUtil.scala
│ │ ├── StringUtil.scala
│ │ ├── TimeUtil.scala
│ │ └── Util.scala
│ └── test
│ └── java
│ ├── FlinkRedisConnectorTest.scala
│ ├── KafkaConsumerDemo.scala
│ └── KafkaConsumerTest.scala
├── docs
├── 0项目简介.md
├── 1数据产品需求.md
├── 2实时数仓架构.md
├── 3实时数仓分层设计.assets
│ ├── 224955E00-1.jpg
│ ├── 224955I30-0.jpg
│ ├── 224955O15-2.jpg
│ ├── 640-20210518140232661.png
│ ├── 640-20210518140232689.png
│ ├── 640-20210518140233105.png
│ ├── 640.png
│ ├── p44562.png
│ ├── p58877.png
│ └── p59651.png
├── 3实时数仓分层设计.md
├── 3实时数仓设计.assets
│ ├── 640
│ ├── 640-20210515184302228
│ ├── 640-20210515184302234
│ ├── 640-20210515184302235
│ ├── 640-20210515184302239
│ ├── 640-20210515184302246
│ ├── 640-20210515184302246-1075382.
│ ├── 640-20210515184302251
│ ├── 640-20210515184302255.png
│ ├── 640-20210515184302298.png
│ ├── 640-20210515184302307.png
│ ├── 640-20210515184302375.png
│ └── Untitled.md
├── 4业务数据采集.md
├── 5用户行为数据采集.md
├── 6业务数据DWD层.md
├── 7流量数据DWD层.md
├── 8实时指标.assets
│ ├── 640-20210516224001799
│ ├── 640-20210516225935573.png
│ ├── 640-20210516232619115
│ ├── 640-20210516232619151.png
│ ├── 640-20210516232619160.png
│ ├── 640-20210516232730698.png
│ ├── 640-20210516233805869.png
│ ├── FFBekRjksJE8Q4rtGN28.png
│ ├── Qktv9k4uWadLTLiXqNOz.png
│ ├── U0PhVDw2bYXZmBKdBrjR.png
│ ├── ZoCJhNbfM6TwIqBvP7t4.png
│ ├── append-mode.png
│ ├── image-20210516235107922.png
│ ├── image-20210518232430888.png
│ ├── image-20210518232504987.png
│ ├── image-20210518233251037.png
│ ├── image-20210519223858298.png
│ ├── image-20210522004340330.png
│ ├── image-20210522004416835.png
│ ├── pbfzmZFLAeBF4O6cFtF2.png
│ ├── query-groupBy-cnt.png
│ ├── query-groupBy-window-cnt.png
│ └── stream-query-stream.png
├── 8实时指标.md
├── 9实时OLAP.assets
│ ├── 2bd1edeecda8a379bde481389ddff425.png
│ ├── 640.jpeg
│ ├── 640.png
│ ├── Data-Cube.png
│ ├── OLAP.png
│ ├── image-20210523193954290.png
│ ├── image-20210523194032047.png
│ ├── image-20210524001623967.png
│ ├── kylin_diagram.png
│ └── v2-6a455b3039e28e98b7592f66910a0793_1440w.jpg
├── 9实时OLAP.md
├── Apache Kylin与ClickHouse 的对比.assets
│ ├── 640
│ ├── 640-20210523225447666.png
│ ├── 640-20210523225447678.png
│ ├── 640-20210523225447718.png
│ ├── 640-20210523225447735
│ ├── 640-20210523225447783.png
│ ├── 640-20210523225447860.png
│ └── 640-20210523225447981.png
├── DWD层数据准备.assets
│ ├── async_io.svg
│ ├── image-20210407224537117.png
│ ├── image-20210409233246633.png
│ ├── image-20210410000728103.png
│ ├── image-20210410000759718.png
│ ├── image-20210413225611694.png
│ ├── image-20210413230248772.png
│ ├── image-20210413230458950.png
│ ├── image-20210413230514762.png
│ ├── image-20210413231328430.png
│ ├── image-20210418152453150.png
│ ├── session-window-join.svg
│ └── tumbling-window-join.svg
├── 业务数据采集.assets
│ ├── image-20210329235325068.png
│ ├── image-20210329235403290.png
│ ├── image-20210401220353400.png
│ ├── image-20210404232758656.png
│ ├── image-20210404233127046.png
│ └── image-20210404233331763.png
├── 产品需求.assets
│ ├── image-20210405165204052.png
│ ├── image-20210405165428593.png
│ ├── image-20210405205643466.png
│ ├── image-20210405205804475.png
│ ├── image-20210405205922293.png
│ ├── image-20210405210015951.png
│ ├── image-20210405210345486.png
│ ├── image-20210405210615660.png
│ ├── image-20210405210828060.png
│ └── image-20210405211124781.png
├── 基于docker部署canal环境.md
├── 如何从0到1构建指标体系.assets
│ ├── 2sVUM4J4nNKHOdqCLVJi.png
│ ├── 66eVXE58NipBmJO4Zsvu.png
│ ├── FFBekRjksJE8Q4rtGN28-20210516233233469.png
│ ├── FltPuhpqlLUUPeLzk7cJ.png
│ ├── IODeeazNNoOlmLJ4S0Lu.png
│ ├── KkQIpy08fKwfnLJgKZQI.png
│ ├── Qktv9k4uWadLTLiXqNOz-20210516233233452.png
│ ├── Rv2rBKjEaRKnQ8xuHMmW.png
│ ├── TAOT112YZQUkjsxPBEv1.jpg
│ ├── U0PhVDw2bYXZmBKdBrjR-20210516233233322.png
│ ├── WtbMmcHjgmkuFiFLhP8g.png
│ ├── ZoCJhNbfM6TwIqBvP7t4-20210516233233415.png
│ ├── gDwC1ZSk527aLIdCTUbY.png
│ ├── hpipN9GYAin3xPDvJG3L.png
│ ├── itMgHpcqrkHHogkaO7A1.png
│ ├── pbfzmZFLAeBF4O6cFtF2-20210516233233439.png
│ ├── r82Fof1uKLtZa7gtsbe4.png
│ └── u7LlkgKdFht23fDZvEAO.png
├── 如何从0到1构建指标体系.md
├── 实时数仓架构.assets
│ ├── image-20210328225453095.png
│ ├── image-20210328231618797.png
│ ├── image-20210328232802457.png
│ ├── image-20210328233222184.png
│ ├── image-20210328233335006.png
│ ├── image-20210328233720452.png
│ └── image-20210411153254131.png
├── 数据埋点需求.assets
│ └── link-solid.svg
├── 数据埋点需求.md
├── 用户行为数据采集.assets
│ └── 640.png
└── 项目简介.assets
│ └── image-20210402102703175.png
├── dwd2dws
├── pom.xml
└── src
│ └── main
│ └── scala
│ └── com
│ └── gmall
│ └── data
│ ├── App.scala
│ └── Sql.scala
├── ods2dim
├── pom.xml
└── src
│ └── main
│ ├── resources
│ ├── log4j.properties
│ └── logback.xml
│ └── scala
│ └── com
│ └── gmall
│ └── data
│ └── dim
│ ├── App.scala
│ ├── Step.scala
│ ├── StreamTopology.scala
│ └── sink
│ ├── Category3InfoSink.scala
│ ├── ProvinceInfoSink.scala
│ ├── SkuInfoSink.scala
│ ├── SpuInfoSink.scala
│ ├── TradeInfoSink.scala
│ └── UserInfoSink.scala
├── ods2dwd
├── pom.xml
└── src
│ ├── main
│ ├── resources
│ │ ├── event_mapping.txt
│ │ ├── log4j.properties
│ │ └── logback.xml
│ └── scala
│ │ └── com
│ │ └── gmall
│ │ └── data
│ │ └── dwd
│ │ ├── App.scala
│ │ ├── FlowTopology.scala
│ │ ├── FlowTopologyV2.scala
│ │ ├── Step.scala
│ │ ├── StreamTopology.scala
│ │ └── transform
│ │ ├── DwdLogJoinDimEvent.scala
│ │ ├── EventTypeSplitFunc.scala
│ │ ├── OdsActionLogConvert.scala
│ │ ├── OdsBaseLogConvert.scala
│ │ ├── OrderDetailAndCouponMerger.scala
│ │ ├── OrderDetailAndDimUserJoin.scala
│ │ └── OrderInfoAndDetailMerger.scala
│ └── test
│ └── java
│ ├── JedisSetTest.scala
│ └── KafkaConsumerTest.scala
├── pom.xml
└── tools
├── pom.xml
└── src
└── main
├── resources
├── ods_entity.template
└── ods_meta.json
└── scala
└── com
└── gmall
└── data
└── tools
└── OdsModelGenerator.scala
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Scala template
3 | *.class
4 | *.log
5 |
6 | .idea
7 | *.iml
8 |
9 | target/
10 |
--------------------------------------------------------------------------------
/README.MD:
--------------------------------------------------------------------------------
1 | # 电商实时数仓项目
2 |
3 | ## 产品需求
4 |
5 | [产品需求](docs/产品需求.md)
6 |
7 | [数据埋点需求](docs/1数据产品需求.md)
8 |
9 | ## 实时数仓架构
10 |
11 | [1.项目简介](docs/0项目简介.md)
12 |
13 | [2.实时数仓架构](docs/2实时数仓架构.md)
14 |
15 | [3.实时数仓分层设计](docs/3实时数仓分层设计.md)
16 |
17 | ## 数据采集
18 |
19 | [1.业务数据采集](docs/4业务数据采集.md)
20 |
21 | [2.用户行为数据采集](docs/5用户行为数据采集.md)
22 |
23 | ## dwd
24 |
25 | [1.业务数据DWD层](docs/6业务数据DWD层.md)
26 |
27 | [2.流量数据DWD层](docs/7流量数据DWD层.md)
28 |
29 | ## dws
30 |
31 | ## 实时数仓的应用场景
32 |
33 | [0.如何从0到1构建指标体系](docs/如何从0到1构建指标体系.md)
34 |
35 | [1.实时指标](docs/8实时指标.md)
36 |
37 | [2.实时OLAP](docs/9实时OLAP.md)
38 |
39 | [3.实时标签]()
40 |
41 | [4.实时特征]()
42 |
43 | **番外**
44 |
45 | [基于Docker部署canal环境](docs/基于docker部署canal环境.md)
46 |
--------------------------------------------------------------------------------
/collections/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | realtime-dw
7 | com.gmall.data
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | collections
13 |
14 |
15 |
16 | com.alibaba.otter
17 | canal.client
18 | 1.1.4
19 |
20 |
21 | org.apache.spark
22 | spark-core_2.11
23 | 2.1.1
24 |
25 |
26 | org.apache.spark
27 | spark-sql_2.11
28 | 2.1.1
29 |
30 |
31 | com.fasterxml.jackson.core
32 | jackson-databind
33 | 2.6.6
34 |
35 |
36 | com.fasterxml.jackson.dataformat
37 | jackson-dataformat-csv
38 | 2.6.6
39 |
40 |
41 |
42 | com.alibaba
43 | fastjson
44 | 1.2.73
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | org.apache.maven.plugins
53 | maven-compiler-plugin
54 | 3.1
55 |
56 | 1.8
57 | 1.8
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/collections/src/main/java/com/gmall/data/collection/flow/Csv2JsonDemo02.java:
--------------------------------------------------------------------------------
1 | package com.gmall.data.collection.flow;
2 |
3 | import java.io.File;
4 | import java.util.List;
5 | import java.util.Map;
6 |
7 | import com.fasterxml.jackson.databind.ObjectMapper;
8 | import com.fasterxml.jackson.dataformat.csv.CsvMapper;
9 | import com.fasterxml.jackson.dataformat.csv.CsvSchema;
10 | public class Csv2JsonDemo02 {
11 |
12 | public static void main(String[] args) throws Exception{
13 |
14 | File input = new File("/Users/wufengchi/Downloads/shence_log0509.csv");
15 | File output = new File("collections/src/main/resources/data/shence_log0509.json");
16 |
17 | CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
18 | CsvMapper csvMapper = new CsvMapper();
19 |
20 | // Read data from CSV file
21 | List