详尽分享音乐数据中心数仓综合项目

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 详尽分享音乐数据中心数仓综合项目

一、数据来源

数据中心项目中包含业务系统数据和用户行为日志数据。

? 业务数据即业务系统产生的业务数据,例如:系统中产生的订单、登录、点歌、广告展示等数据。

?用户行为数据例如:用户在实体机器上操作的行为都是用户行为数据,点击、收藏、扫码等事件。

二、项目架构

离线处理:以 Spark 为主,其中很少使用了 SparkCore 的代码,主要使用 SparkSQL构建数据仓库。项目使用 airflow/Azkaban 进行调度,可以每日进行调度,也可以每月进行调度,每天定时触发调度。

实时处理:使用 SparkStreaming 实现实时处理。离线 N+1 的方式不能得到实时数据,运营活动中心有时需要实时的用户上线数据,针对客户端进行数据埋点,用户在客户端所有的行为都是事件,对事件进行埋点,当用户触发了一些事件时,判断用户是否满足了目标用户情况。

同时包括离线处理和实时处理的架构,称为lambda架构设计。

说明:

(1)将业务系统中的数据通过sqoop增量或者全量导入到数据仓库,关于用户日志的数据,由公司运维人员打包好,每天定时上传到HDFS集群,由我们来读取HDFS中的数据,然后使用SparkCore+SparkSQL对数据进行ETL,增量写入数据仓库。

(2)将数据仓库分为3层,为ODS层、EDS层和DM层。

三、数据仓库模型

数据仓库按照主题分为三个主题:用户、机器、内容(歌曲相关、歌手相关)。每个主题下面都有对应的表。数据仓库的设计分为三层,如下:

? ODS 层:

ODS 文件中是从业务数据库中抽取出来数据表的原数据, 数据从关系型数据库 MySQL中导入,转换成 Parquet 格式的文件存在 HDFS 中,后期方便使用 SparkSQL 处理。

ODS 层数据来源如下:

外部数据源:网易云爬取歌曲热度数据、歌手热度数据,爬取数据是 json 格式的数据。

内部数据源:主要有 MySQL 和客户端上传 json 数据。MySQL 使用 Sqoop 抽取数据到 HDFS 中,导入 ODS 层。客户端产生日志到客户端服务器,客户端服务器由运维人员每天将数据压缩成包导入到 HDFS 路径中,也就是 ODS 层。

? EDS 层:

EDS 层负责信息集成、轻度汇总类数据。简单理解就是将事务性的数据组织成便于分析的仓库维度建模类型的数据,做一些轻度聚合,类似 Hive 中的宽表。例如:将 ODS 层数据进行清洗,如果主题是用户主题,那么就按照用户 id 为粒度将数据组织在一起。如果主题是机器,那么就按照机器 id 为粒度将数据组织在一起。

以上 ODS 层和 EDS 层使用 Spark 代码处理数据,然后利用 SparkSQL 读取 ODS 层数据,保存到 Hive 的 EDS 层。

? DM 层:

DM 层的数据有一部分是存储在 Hive 表中,或者保存分析结果到 MySQL、HBase 等。EDS 层数据是 parquet 格式的数据,放在 Hive 的主要原因是后期使用 Kylin 查询一些业务,数据放 MySQL 的都是结果数据,放在 HBase 的原因是设涉及到大表的明细查询。

四、数据仓库命名规范

五、业务需求

======第一个业务需求:统计歌曲热度、歌手热度排行 ======

1日歌曲热度、歌手热度

7日歌曲热度、歌手热度

30日歌曲热度、歌手热度

1日、7日、30日歌曲的点唱数

1日、7日、30日歌曲的点赞数

1日、7日、30日歌曲的点唱用户数

1日、7日、30日歌曲的点唱订单数据

7日、30日歌曲最高点唱、点赞量

1日、7日、30日歌手的点唱数

1日、7日、30日歌手的点赞数

1日、7日、30日歌手的点唱用户数

1日、7日、30日歌手的点唱订单数据

7日、30日歌手最高点唱、点赞量

===== 需求分析=======

需要数据:

1).每天用户点播歌曲的日志数据,由运维人员每天上传到HDFS系统中。--数据来源于用户行为日志

2).歌曲基本信息表【歌曲对应歌手信息】--数据来源于原业务系统

===== 模型表设计 =======

ODS层:

TO_CLIENT_SONG_PLAY_OPERATE_REQ_D - 客户端歌曲播放表

TO_SONG_INFO_D - 歌库歌曲表

  对ODS中的表数据进行清洗,得到EDS层数据库表

EDS层:

TW_SONG_BASEINFO_D - 歌曲基本信息日全量表

TW_SONG_FTUR_D - 歌曲特征日统计

TW_SONG_RSI_D - 歌曲影响力指数日统计

TW_SINGER_RSI_D - 歌手影响力指数日统计

DM层:mysql中

tm_song_rsi -歌曲影响力指数表

tm_singer_rsi -歌手影响力指数表

====== TW_SONG_FTUR_D 歌曲特征日统计 =====

1. 当日点唱量 SING_CNT

当日点赞量 SUPP_CNT

当日点唱用户数 USR_CNT

当日点唱订单数 ORDR_CNT

SELECT

songid , -- 歌曲id

count(songid), -- 歌曲当日点唱量

0 as supp_cnt, -- 歌曲当日点赞量

count(distinct uid), -- 当日点唱用户数

count(distinct order_id) --当日点唱订单数

FROM

TO_CLIENT_SONG_PLAY_OPERATE_REQ_D

WHERE data_dt = 当日日期

GROUP BY songid

2.近七天点唱量 RCT_7_SING_CNT

近七天点赞量 RCT_7_SUPP_CNT

近七天点唱用户数 RCT_7_USR_CNT

近七天点唱订单数 RCT_7_ORDR_CNT

SELECT

songid , -- 歌曲id

count(songid), -- 歌曲7日点唱量

0 as supp_cnt, -- 歌曲7日点赞量

count(distinct uid), -- 7日点唱用户数

count(distinct order_id) --7日点唱订单数

FROM

TO_CLIENT_SONG_PLAY_OPERATE_REQ_D

WHERE data_dt >= 前7天日期 and data_dt [/span>= 当前天日期

GROUP BY songid

3.近三十天点唱量 RCT_30_SING_CNT

近三十天点赞量 RCT_30_SUPP_CNT

近三十天点唱用户数 RCT_30_USR_CNT

近三十天点唱订单数 RCT_30_ORDR_CNT

SELECT

songid , -- 歌曲id

count(songid), -- 歌曲30日点唱量

0 as supp_cnt, -- 歌曲30日点赞量

count(distinct uid), -- 30日点唱用户数

count(distinct order_id) --30日点唱订单数

FROM

TO_CLIENT_SONG_PLAY_OPERATE_REQ_D

WHERE data_dt = 当前天日期

GROUP BY songid

4.近七天最高日点唱量 RCT_7_TOP_SING_CNT

近七天最高日点赞量 RCT_7_TOP_SUPP_CNT

近三十天最高日点唱量 RCT_30_TOP_SING_CNT

近三十天最高日点赞量 RCT_30_TOP_SUPP_CNT

SELECT

NBR, -- 歌曲id

max(CASE WHEN DATE_DT

max(CASE WHEN DATE_DT >= 前7天日期 THEN SUPP_CNT ELSE 0 END) as RCT_7_TOP_SUPP_CNT ,--近七天最高日点赞量

max(SING_CNT) as RCT_30_TOP_SING_CNT ,--近三十天最高日点唱量

max(SUPP_CNT) as RCT_30_TOP_SUPP_CNT -- 近三十天最高日点赞量

FROM

TW_SONG_FTUR_D

WHERE data_dt >= 前30天日期 and data_dt [/span>= 当前天日期

GROUP BY songid

===== 统计歌曲热度 TW_SONG_RSI_D ======

TW_SONG_RSI_D :

周期(1/7/30) PERIOD

歌曲编号 NBR

歌曲名 NAME

近期歌曲热度 RSI

近期歌曲热度排名 RSI_RANK

数据日期 DATA_DT

TW_SONG_FTUR_D - 歌曲特征日统计

temp:

SELECT

NBR,NAME,(xxx) as 1RSI,(xxx) as 7RSI,(xxx) as 30RSI,data_dt

FROM

TW_SONG_FTUR_D

WHERE data_dt = 20201230

统计歌曲1日热度:

SELECT

"1日" as PERIOD,NBR,NAME,1RSI as RSI,row_number() over(partition by data_dt order by 1RSI desc) as RSI_RANK,DATA_DT

FROM temp

统计歌曲7日热度:

SELECT

"7日" as PERIOD,NBR,NAME,7RSI as RSI,row_number() over(partition by data_dt order by 7RSI desc) as RSI_RANK,DATA_DT

FROM temp

统计歌曲30日热度:

SELECT

"30日" as PERIOD,NBR,NAME,30RSI as RSI,row_number() over(partition by data_dt order by 30RSI desc) as RSI_RANK,DATA_DT

FROM temp

以上三个union 得到总结果

======= 统计歌手热度 TW_SINGER_RSI_D ======

TW_SINGER_RSI_D:

周期 PERIOD

歌手ID SINGER_ID

歌手名称 SINGER_NAME

近期歌手热度 RSI

近期歌手热度排名 RSI_RANK

数据日期 DATA_DT

TW_SONG_FTUR_D - 歌曲特征日统计

temp:

SELECT

SINGER1ID,

SINGER1,

sum(SING_CNT) as TOTAL_SING_CNT ,

sum(SUPP_CNT) as TOTAL_SUPP_CNT ,

sum(RCT_7_SING_CNT) as TOTAL_RCT_7_SING_CNT ,

sum(RCT_7_SUPP_CNT) as TOTAL_RCT_7_SUPP_CNT ,

sum(RCT_7_TOP_SING_CNT) as TOTAL_RCT_7_TOP_SING_CNT ,

sum(RCT_7_TOP_SUPP_CNT) as TOTAL_RCT_7_TOP_SUPP_CNT ,

sum(RCT_30_SING_CNT) as TOTAL_RCT_30_SING_CNT ,

sum(RCT_30_SUPP_CNT) as TOTAL_RCT_30_SUPP_CNT ,

sum(RCT_30_TOP_SING_CNT) as TOTAL_RCT_30_TOP_SING_CNT ,

sum(RCT_30_RCT_30_ORDR_CNT) as TOTAL_RCT_30_ORDR_CNT

FROM

TW_SONG_FTUR_D

WHERE data_dt = 20201230

GROUP BY SINGER1ID,SINGER1

temp2:

SELECT

SINGER1ID,SINGER1,(xxx) as 1RSI,(xxx) as 7RSI,(xxx) as 30RSI,data_dt

FROM

temp

统计歌手1日热度:

SELECT

"1日" as PERIOD,SINGER1ID as SINGER_ID,SINGER1 as SINGER_NAME,

1RSI as RSI,row_number() over(partition by data_dt order by 1RSI desc) as RSI_RANK

FROM temp2

统计歌手7日热度:

SELECT

"7日" as PERIOD,SINGER1ID as SINGER_ID,SINGER1 as SINGER_NAME,

7RSI as RSI,row_number() over(partition by data_dt order by 7RSI desc) as RSI_RANK

FROM temp2

统计歌手30日热度:

SELECT

"30日" as PERIOD,SINGER1ID as SINGER_ID,SINGER1 as SINGER_NAME,

30RSI as RSI,row_number() over(partition by data_dt order by 30RSI desc) as RSI_RANK

FROM temp2

以上三个union 得到总结果

1、用户上报的日志数据 currentday_clientlog.tar.gz 解压之后的部分数据格式如下:(中间用间隔)

1 157530235099712MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2546, "mid": 99712, "adv_type": 4, "src_type": 2546, "uid": 0, "session_id": 48565, "event_id": 1, "time": 1575302349}3.0.1.152.4.4.30

2 157530235089316MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2565, "mid": 89316, "adv_type": 4, "src_type": 2565, "uid": 0, "session_id": 33762, "event_id": 1, "time": 1575302348}3.0.1.122.4.4.26

3 157530235054398MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2546, "mid": 54398, "adv_type": 4, "src_type": 2546, "uid": 0, "session_id": 31432, "event_id": 1, "time": 1575302349}3.0.1.142.4.4.30

4 157530235049120MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2546, "mid": 49120, "adv_type": 4, "src_type": 2546, "uid": 0, "session_id": 25078, "event_id": 1, "time": 1575302350}3.0.1.152.4.4.30

5 157530235057563MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2571, "mid": 57563, "adv_type": 4, "src_type": 2571, "uid": 0, "session_id": 13577, "event_id": 1, "time": 1575302349}3.0.1.152.4.4.30

6 157530235091764MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2546, "mid": 91764, "adv_type": 4, "src_type": 2546, "uid": 0, "session_id": 7075, "event_id": 1, "time": 1575302348}3.0.1.122.4.4.26

7 157530235199695MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2558, "mid": 99695, "adv_type": 4, "src_type": 2558, "uid": 0, "session_id": 27410, "event_id": 1, "time": 1575302350}3.0.1.152.4.4.30

8 157530235198105MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 1619, "mid": 98105, "adv_type": 4, "src_type": 1619, "uid": 0, "session_id": 1553, "event_id": 1, "time": 1575302349}3.0.1.152.4.4.30

9 157530235195059MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2525, "mid": 95059, "adv_type": 2, "src_type": 0, "uid": 49915629, "session_id": 28419, "event_id": 1, "time": 1575302350}3.0.1.152.4.4.30

10 15753023511958MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2546, "mid": 1958, "adv_type": 4, "src_type": 2546, "uid": 0, "session_id": 60656, "event_id": 1, "time": 1575302350}3.0.1.152.4.4.30

11 157530235152166MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2565, "mid": 52166, "adv_type": 4, "src_type": 2565, "uid": 0, "session_id": 42636, "event_id": 1, "time": 1575302350}3.0.1.152.4.4.30

12 157530235191267MINIK_CLIENT_ADVERTISEMENT_RECORD{"src_verison": 2565, "mid": 91267, "adv_type": 4, "src_type": 2565, "uid": 0, "session_id": 81201, "event_id": 1, "time": 1575302349}3.0.1.142.4.4.30

............

2、歌曲基本信息表【歌曲对应歌手信息】中的数据来源于原业务系统数据库songdb。

数据库表song的建表sql及部分数据如下:(对应sql文件为 songdb.sql)

--

-- Table structure for song

--

DROP TABLE IF EXISTS song;

CREATE TABLE song (

source_id varchar(100) NOT NULL COMMENT '主键ID',

name varchar(100) DEFAULT NULL //代码效果参考:http://www.zidongmutanji.com/zsjx/496207.html

COMMENT '歌曲名字',

other_name varchar(100) DEFAULT NULL COMMENT '其他名字',

source int(11) DEFAULT NULL COMMENT '来源',

album varchar(100) DEFAULT NULL COMMENT '所属专辑',

product varchar(100) DEFAULT NULL COMMENT '发行公司',

language varchar(100) DEFAULT NULL COMMENT '歌曲语言',

video_format varchar(100) DEFAULT NULL COMMENT '视频风格',

duration int(11) DEFAULT NULL COMMENT '时长',

singer_info varchar(100) DEFAULT NULL COMMENT '歌手信息',

post_time varchar(100) DEFAULT NULL COMMENT '发行时间',

pinyin_first varchar(100) DEFAULT NULL COMMENT '歌曲首字母',

pinyin varchar(100) DEFAULT NULL COMMENT '歌曲全拼',

singing_type int(11) DEFAULT NULL COMMENT '演唱类型',

original_singer varchar(100) DEFAULT NULL COMMENT '原唱歌手',

lyricist varchar(100) DEFAULT NULL COMMENT '填词',

composer varchar(100) DEFAULT NULL //代码效果参考:http://www.zidongmutanji.com/zsjx/302911.html

COMMENT '作曲',

bpm int(11) DEFAULT NULL COMMENT 'BPM值',

star_level int(11) DEFAULT NULL COMMENT '星级',

video_quality int(11) DEFAULT NULL COMMENT '视频画质',

video_make int(11) DEFAULT NULL COMMENT '视频制作方式',

video_feature int(11) DEFAULT NULL COMMENT '视频画面特征',

lyric_feature int(11) DEFAULT NULL COMMENT '歌词字母特点',

Image_quality int(11) DEFAULT NULL COMMENT '画质评价',

subtitles_type int(11) DEFAULT NULL COMMENT '字幕类型',

audio_format int(11) DEFAULT NULL COMMENT '音频格式',

original_sound_quality int(11) DEFAULT NULL COMMENT '原唱音质',

original_track int(11) DEFAULT NULL COMMENT '音轨',

original_track_vol int(11) DEFAULT NULL COMMENT '原唱音量',

accompany_version int(11) DEFAULT NULL COMMENT '伴唱版本',

accompany_quality int(11) DEFAULT NULL COMMENT '伴唱音质',

acc_track_vol int(11) DEFAULT //代码效果参考:http://www.zidongmutanji.com/bxxx/44218.html

NULL COMMENT '伴唱音量',

accompany_track int(11) DEFAULT NULL COMMENT '伴唱音轨',

width int(11) DEFAULT NULL COMMENT '视频分辨率W',

height int(11) DEFAULT NULL COMMENT '视频分辨率H',

video_resolution int(11) DEFAULT NULL COMMENT '视频分辨率',

song_version int(11) DEFAULT NULL COMMENT '编曲版本',

authorized_company varchar(100) DEFAULT NULL COMMENT '授权公司',

status int(11) DEFAULT NULL COMMENT '状态',

publish_to varchar(100) DEFAULT NULL COMMENT '产品类型',

PRIMARY KEY (source_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--

-- Records of song

--

INSERT INTO song VALUES ('10000001', 'Footprints In The Sand(live)', '沙滩上的脚印(live)', '1', '【{\"name\":\"《中国好声音第二季 第十五期》\",\"id\":\"5ce5ffdb2a0b8b6b4707263e\"}】', '', 'E', 'X', '242', '【{\"name\":\"萱萱\",\"id\":\"20342\"}】', '1.3810752E+12', 'FITSSTSDJYL', 'footprintsinthesandshatanshangdejiaoyinlive', '2', '【{\"name\":\"Leona Lewis\",\"id\":\"2734\"}】', '【{\"name\":\"Richard Page\",\"id\":\"1025472\"},{\"name\":\" Per Magnusson\",\"id\":\"1025473\"}】', '【{\"name\":\"David Kreuger\",\"id\":\"1025474\"},{\"name\":\"Simon Cowell\",\"id\":\"1025475\"}】', '0', '0', '2', '0', '0', '0', '0', '1', '3', '0', '1', '50', '2', '1', '50', '0', '1920', '1080', '1', '1', '', '3', '【2.0,8.0】');

INSERT INTO song VALUES ('10000002', '不许你注定一人', '', '1', '【{\"name\":\"《不许你注定一人》\",\"id\":\"5c19b89450057d3b20232f7a\"}】', '', 'C', 'M', '305', '【{\"name\":\"Dear Jane\",\"id\":\"1187\"}】', '1.3819392E+12', 'BXNZDYR', 'buxunizhudingyiren', '1', '【】', '【{\"name\":\" Howie@Dear Jane\",\"id\":\"1021658\"}】', '【{\"name\":\" Howie@Dear Jane\",\"id\":\"1021658\"}】', '0', '0', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '1', '50', '0', '1920', '1080', '1', '1', '', '3', '【8.0,2.0,9】');

INSERT INTO song VALUES ('10000003', '爱上你的美(live)', '', '1', '【{\"name\":\"《最美和声第一季 第13期》\",\"id\":\"5db140bda1b80f5bc4e8960f\"}】', '', 'M', 'M', '220', '【{\"name\":\"胡海泉\",\"id\":\"10306\"},{\"name\":\"丁于\",\"id\":\"6311\"}】', '1.3815072E+12', 'ASNDML', 'aishangnidemeilive', '1', '【】', '【{\"name\":\"胡海泉\",\"id\":\"1027408\"}】', '【{\"name\":\"Bob Crewe\",\"id\":\"1021234\"},{\"name\":\"Bob Gaudio\",\"id\":\"1021235\"}】', '0', '0', '2', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '1', '50', '0', '1920', '1080', '1', '2', '', '3', '【2.0,8.0】');

INSERT INTO song VALUES ('10000004', '翅膀', '', '1', '【{\"name\":\"《最美和声 第13期》\",\"id\":{\"$oid\":\"5c19ae0e50057d3b202313e3\"}}】', '蓝色火焰', 'M', 'M', '196', '【{\"name\":\"胡海泉\",\"id\":\"10306\"},{\"name\":\"田斯斯\",\"id\":\"20343\"}】', '2013-10-31 00:00:00', 'CB', 'chibang', '0', '', '', '', '0', '0', '2', '0', '0', '0', '0', '0', '0', '0', '1', '50', '0', '0', '50', '0', '1920', '1080', '1', '0', '', '1', '【2.0,8.0】');

INSERT INTO song VALUES ('10000005', 'Baby I Love You', '', '1', '【{\"name\":\"《阿里郎》\",\"id\":\"5c19b20850057d3b20231e48\"}】', '', 'M', 'M', '194', '【{\"name\":\"金贵晟\",\"id\":\"20245\"}】', '1.3783968E+12', 'BILY', 'babyiloveyou', '1', '【】', '【{\"name\":\"代岳冬\",\"id\":\"1037983\"}】', '【{\"name\":\"金贵晟\",\"id\":\"20245\"}】', '0', '0', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '2', '50', '0', '1920', '1080', '1', '1', '', '3', '【2.0,8.0】');

INSERT INTO song VALUES ('10000007', 'My Little Friend', '', '1', '【{\"name\":\"《Say The Words》\",\"id\":\"5c19a78350057d3b2023025d\"}】', '', 'E', 'S', '340', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '1.3569696E+12', 'MLF', 'mylittlefriend', '1', '【】', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '0', '0', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '2', '50', '0', '1920', '1080', '1', '1', '', '3', '【2.0,8.0】');

INSERT INTO song VALUES ('10000008', 'X', '', '1', '【{\"name\":\"《痞得胖》\",\"id\":\"5c19adf550057d3b2023139f\"}】', '禾广娱乐', 'M', 'M', '328', '【{\"name\":\"怕胖团\",\"id\":\"20474\"}】', '2013-10-31 00:00:00', 'X', '', '1', '【】', '【{\"name\":\"闪亮\",\"id\":\"1020755\"}】', '【{\"name\":\"闪亮\",\"id\":\"1020755\"}】', '92', '5', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '0', '1', '50', '2', '1920', '1080', '1', '0', '', '1', '【8.0,2.0,9】');

INSERT INTO song VALUES ('10000009', 'Melody(Live)', '', '1', '【{\"name\":\"《中国好声音第二季 第十五期》\",\"id\":\"5ce5ffdb2a0b8b6b4707263e\"}】', '', 'M', 'X', '205', '【{\"name\":\"萱萱\",\"id\":\"20342\"}】', '1.3810752E+12', 'ML', 'melodylive', '2', '【{\"name\":\" 陶喆 \",\"id\":\"1026474\"}】', '【{\"name\":\"娃娃\",\"id\":\"1023192\"},{\"name\":\" 陶喆 \",\"id\":\"1026474\"}】', '【{\"name\":\" 陶喆 \",\"id\":\"1026474\"}】', '0', '0', '2', '0', '0', '0', '0', '1', '3', '0', '1', '50', '2', '1', '50', '0', '1920', '1080', '1', '2', '', '3', '【2.0,8.0】');

INSERT INTO song VALUES ('10000010', '到底是哪个混蛋敢欺负我的朋友', '', '1', '《LANDIVA》', '', 'M', 'M', '229', '【{\"name\":\"蓝心湄\",\"id\":\"15575\"}】', '2013-11-01 00:00:00', 'DDSNGHDGQFWDPY', 'daodishinagehundanganqifuwodepengyou', '0', '', '', '', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '1', '50', '0', '0', '49', '0', '1920', '1080', '1', '0', '', '1', '【2.0,8.0】');

INSERT INTO song VALUES ('10000011', '爱的海洋', '', '1', '【{\"name\":\"《Say The Words 我为你歌唱》\",\"id\":\"5c19ac9050057d3b20230fe3\"}】', '', 'M', 'M', '230', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '1.3820256E+12', 'ADHY', 'aidehaiyang', '1', '【】', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '【{\"name\":\"曲婉婷\",\"id\":\"16277\"}】', '0', '0', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '1', '50', '0', '1920', '1080', '1', '1', '', '3', '【8.0,2.0,9】');

INSERT INTO song VALUES ('10000012', '爱洗虾米', '', '1', '【{\"name\":\"《旺得福》\",\"id\":{\"$oid\":\"5c19a6c550057d3b20230062\"}}】', '亚神音乐', 'T', 'M', '273', '【{\"name\":\"旺福\",\"id\":\"9300\"}】', '2013-11-01 00:00:00', 'AXXM', 'aixixiami', '0', '', '', '', '0', '0', '2', '0', '0', '0', '0', '0', '0', '0', '1', '50', '0', '0', '50', '0', '1920', '1080', '1', '0', '', '1', '【2.0】');

INSERT INTO song VALUES ('10000013', '爱投罗网', '', '1', '【{\"name\":\"《狮子吼》\",\"id\":\"5c19b6a050057d3b20232a58\"}】', '', 'M', 'M', '319', '【{\"name\":\"罗志祥\",\"id\":\"1021663\"}】', '1.38384E+12', 'ATLW', 'aitouluowang', '1', '【】', '【{\"name\":\"李宗恩\",\"id\":\"1021817\"}】', '【{\"name\":\"Drew Ryan Scott\",\"id\":\"1027900\"},{\"name\":\"Jacim Persson\",\"id\":\"1031575\"}】', '0', '0', '1', '0', '0', '0', '0', '1', '3', '0', '1', '50', '1', '1', '50', '0', '1920', '1080', '1', '1', '', '3', '【8.0,2.0,9】');

将数据导入到mysql数据库的步骤:

  (1)打开xshell,连接mysql数据库,创建songdb数据库

(2)打开Navigate,连接到192.168.179.14节点,运行sql文件songdb.sql

(3)查看导入结果

表数据如下:

表结构如下:

数据库表song里面的数据会导入到ODS层中的TO_SONG_INFO_D表中,TO_SONG_INFO_D表信息如下:

EDS层对应的表结构如下

3、数据仓库分层及数据流转处理流程

这里根据需求将表分成如下三层:

基于以上逻辑表建立物理模型如下:

(1) TO_CLIENT_SONG_PLAY_OPERATE_REQ_D 客户端歌曲播放表

CREATE EXTERNAL TABLE IF NOT EXISTS TO_CLIENT_SONG_PLAY_OPERATE_REQ_D(

SONGID string,

MID string,

OPTRATE_TYPE string,

UID string,

CONSUME_TYPE string,

DUR_TIME string,

SESSION_ID string,

SONGNAME string,

PKG_ID string,

ORDER_ID string

)

partitioned by (data_dt string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION '';

(2)TO_SONG_INFO_D 歌库歌曲表

CREATE EXTERNAL TABLE TO_SONG_INFO_D(

NBR string,

NAME string,

OTHER_NAME string,

SOURCE int,

ALBUM string,

PRDCT string,

LANG string,

VIDEO_FORMAT string,

DUR int,

SINGER_INFO string,

POST_TIME string,

PINYIN_FST string,

PINYIN string,

SING_TYPE int,

ORI_SINGER string,

LYRICIST string,

COMPOSER string,

BPM_VAL int,

STAR_LEVEL int,

VIDEO_QLTY int,

VIDEO_MK int,

VIDEO_FTUR int,

LYRIC_FTUR int,

IMG_QLTY int,

SUBTITLES_TYPE int,

AUDIO_FMT int,

ORI_SOUND_QLTY int,

ORI_TRK int,

ORI_TRK_VOL int,

ACC_VER int,

ACC_QLTY int,

ACC_TRK_VOL int,

ACC_TRK int,

WIDTH int,

HEIGHT int,

VIDEO_RSVL int,

SONG_VER int,

AUTH_CO string,

STATE int,

PRDCT_TYPE string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION '';

(3)TW_SONG_BASEINFO_D 歌曲基本信息日全量表

CREATE EXTERNAL TABLE TW_SONG_BASEINFO_D(

NBR string,

NAME string,

SOURCE int,

ALBUM string,

PRDCT string,

LANG string,

VIDEO_FORMAT string,

DUR int,

SINGER1 string,

SINGER2 string,

SINGER1ID string,

SINGER2ID string,

MAC_TIME int,

POST_TIME string,

PINYIN_FST string,

PINYIN string,

SING_TYPE int,

ORI_SINGER string,

LYRICIST string,

COMPOSER string,

BPM_VAL int,

STAR_LEVEL int,

VIDEO_QLTY int,

VIDEO_MK int,

VIDEO_FTUR int,

LYRIC_FTUR int,

IMG_QLTY int,

SUBTITLES_TYPE int,

AUDIO_FMT int,

ORI_SOUND_QLTY int,

ORI_TRK int,

ORI_TRK_VOL int,

ACC_VER int,

ACC_QLTY int,

ACC_TRK_VOL int,

ACC_TRK int,

WIDTH int,

HEIGHT int,

VIDEO_RSVL int,

SONG_VER int,

AUTH_CO string,

STATE int,

PRDCT_TYPE array[/span>string

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

STORED AS PARQUET

LOCATION '';

(4)TW_SONG_FTUR_D 歌曲特征日统计表

CREATE EXTERNAL TABLE TW_SONG_FTUR_D(

NBR string,

NAME string,

SOURCE int,

ALBUM string,

PRDCT string,

LANG string,

VIDEO_FORMAT string,

DUR int,

SINGER1 string,

SINGER2 string,

SINGER1ID string,

SINGER2ID string,

MAC_TIME int,

SING_CNT int,

SUPP_CNT int,

USR_CNT int,

ORDR_CNT int,

RCT_7_SING_CNT int,

RCT_7_SUPP_CNT int,

RCT_7_TOP_SING_CNT int,

RCT_7_TOP_SUPP_CNT int,

RCT_7_USR_CNT int,

RCT_7_ORDR_CNT int,

RCT_30_SING_CNT int,

RCT_30_SUPP_CNT int,

RCT_30_TOP_SING_CNT int,

RCT_30_TOP_SUPP_CNT int,

RCT_30_USR_CNT int,

RCT_30_ORDR_CNT int

)

PARTITIONED BY (data_dt string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION '';

(5)TW_SINGER_RSI_D 歌手影响力日统计表

CREATE EXTERNAL TABLE TW_SINGER_RSI_D(

PERIOD string,

SINGER_ID string,

SINGER_NAME string,

RSI string,

RSI_RANK int

)

PARTITIONED BY (data_dt string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION '';

(6)TW_SONG_RSI_D 歌曲影响力日统计表

<span style="color:

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
19天前
|
5月前
|
数据采集 大数据
大数据实战项目之电商数仓(二)
大数据实战项目之电商数仓(二)
130 0
|
3月前
|
BI
数仓项目总结--持续更新中
数仓项目总结--持续更新中
56 2
|
5月前
|
消息中间件 分布式计算 Hadoop
大数据实战项目之电商数仓(一)
大数据实战项目之电商数仓(一)
286 0
|
安全 大数据 调度
助力绿色低碳 阿里巴巴与华北电力大学数据中心算力-电力协同调度项目多项成果发布
助力绿色低碳 阿里巴巴与华北电力大学数据中心算力-电力协同调度项目多项成果发布
助力绿色低碳 阿里巴巴与华北电力大学数据中心算力-电力协同调度项目多项成果发布
|
人工智能 运维 新能源
阿里云数据中心绿色低碳实践项目入选“2022全国十大碳中和示范典型案例”
阿里云数据中心绿色低碳实践项目入选“2022全国十大碳中和示范典型案例”
阿里云数据中心绿色低碳实践项目入选“2022全国十大碳中和示范典型案例”
|
数据采集 监控 Android开发
网站流量日志分析--数仓设计--本项目中数据仓库的设计(星型模型)|学习笔记
快速学习网站流量日志分析--数仓设计--本项目中数据仓库的设计(星型模型)
409 0
网站流量日志分析--数仓设计--本项目中数据仓库的设计(星型模型)|学习笔记
|
存储 数据管理 大数据
电商项目之数仓的元数据管理讲解|学习笔记
快速学习电商项目之数仓的元数据管理讲解
电商项目之数仓的元数据管理讲解|学习笔记
|
数据采集 存储 监控
电商项目之数仓的数据质量监控讲解|学习笔记
快速学习电商项目之数仓的数据质量监控讲解
电商项目之数仓的数据质量监控讲解|学习笔记
|
数据采集 存储 监控
电商项目之数仓的数据产品服务化讲解|学习笔记
快速学习电商项目之数仓的数据产品服务化讲解
电商项目之数仓的数据产品服务化讲解|学习笔记