实验内容:
对MaxCompute数仓公共数据进行预处理,主要对maxcompute_public_data.dwd_product_movie_basic_info(电影基本信息,包含影片名、导演、编剧、主演、影片类型等基础信息)表和maxcompute_public_data.ods_product_movie_box(电影票房基本信息,包含影片名、当日票房、累计票房等信息)进行操作,为后期数据分析做准备工作。
实现思路:
(1)登录DataWorks选择公共数据集
(2)对票房数据进行数据清洗
(3)对票房数据进行数据转换
(4)保存查询后的结果数据
实验步骤:
1.搜索框搜索Dataworks,进入DataWork后,我们需要选择Region区域为【华东2(上海)】(说明:地域请根据实际情况选择,如果不在对应地域的话无法查看到项目列表)
2.如图点击【SQL查询】菜单。
进入到如下页面:
如图点击图标添加公共数据集
在列表中找到公共数据集,点击【添加】
在左侧会出现【公共数据】代表添加公共数据集成功。
下面使用两条SQL语句来体验查询公共数据集里的数据,分别查询2020年手机号归属地基本信息以及查看北京市各运营商的手机号段数量。
如图点击【+】调出SQL编辑器。
在编辑器里输入如下SQL语句:
SELECT *
FROM maxcompute_public_data.dwd_product_phoneno_basic_info_2020
LIMIT 200
;
在执行SQL前需要先授权,否则无法执行。
如图点击图标进行授权。
在【成本预估】弹窗点击【运行】按钮
在下方的【结果】选项卡里出现对应的查询结果
复制下列语句进行搜索:
SELECT isp AS "运营商"
, COUNT(phoneno) AS "手机号段数量"
FROM maxcompute_public_data.dwd_product_phoneno_basic_info_2020
WHERE city = "北京"
GROUP BY isp
ORDER BY "手机号段数量" DESC
LIMIT 200
;
3.公共电影票房数据集解读。
在maxcomput公共数据里出现含有movie的数据表,dwd_product_movie_basic_info和ods_product_movie_box为本次实验所需要查询的数据表。
切换至数据开发下。
点击【临时查询】,新建ODPS SQL为movie。
数据表maxcompute_public_data.dwd_product_movie_basic_info。执行如下语句,可查看dwd_product_movie_basic_info表结构。
SHOW CREATE TABLE maxcompute_public_data.dwd_product_movie_basic_info;
电影基本信息,包含影片名、导演、编剧、主演、影片类型等基础信息。
数据表maxcompute_public_data.ods_product_movie_box。
SHOW CREATE TABLE maxcompute_public_data.ods_product_movie_box;
电影票房基本信息,包含影片名、当日票房、累计票房等信息。
4.数据清洗。
执行如下语句,点击的运行图标。
SELECT movie_name -- 电影名称
,director -- 导演
,scriptwriter -- 编剧
,area -- 制片地区/国家
,actors -- 主演
,type -- 类型
,movie_length -- 电影长度
,movie_date -- 上映日期
,movie_language -- 语言
,imdb_url -- imdb号
,ds
FROM maxcompute_public_data.dwd_product_movie_basic_info
WHERE ds = MAX_PT('maxcompute_public_data.dwd_product_movie_basic_info')
LIMIT 200;
运行结果如下。
对maxcompute_public_data.dwd_product_movie_basic_info表进行数据清洗处理,去除没有制片地区/国家的数据。
选中maxcompute_public_data.dwd_product_movie_basic_info表,修改SQL语句,增加筛选条件去除没有制片地区/国家的数据。(area != ‘’ 代表area字段下面的值不允许是空值)
SELECT movie_name -- 电影名称
,director -- 导演
,scriptwriter -- 编剧
,area -- 制片地区/国家
,actors -- 主演
,type -- 类型
,movie_length -- 电影长度
,movie_date -- 上映日期
,movie_language -- 语言
,imdb_url -- imdb号
,ds
FROM maxcompute_public_data.dwd_product_movie_basic_info
WHERE ds = MAX_PT('maxcompute_public_data.dwd_product_movie_basic_info')
AND area != ''
LIMIT 200;
查询动作片的票房数据。
从票房数据里筛选出前200条动作片的数据。
修改SQL语句如下:(area!=’’代表area字段不为空的数据,并列条件 AND type = ‘动作’代表查询类型为动作的数据,同样返回前200条数据)
SELECT movie_name -- 电影名称
,director -- 导演
,scriptwriter -- 编剧
,area -- 制片地区/国家
,actors -- 主演
,type -- 类型
,movie_length -- 电影长度
,movie_date -- 上映日期
,movie_language -- 语言
,imdb_url -- imdb号
,ds
FROM maxcompute_public_data.dwd_product_movie_basic_info
WHERE ds = MAX_PT('maxcompute_public_data.dwd_product_movie_basic_info')
AND area != ''
AND type = '动作'
LIMIT 200;
5.数据转换。
公共数据集中描述电影票房的表一共有2个,dwd_product_movie_basic_info里的movie_name和ods_product_movie_box里的moviename都保存的是电影名称信息,我们可以对两张表的数据进行数据转换,将相同电影名称的两条数据合并转换为一条数据。
修改SQL语句,代码如下:
WITH
a as(SELECT ds,moviename,sumboxoffice,DENSE_RANK() OVER (PARTITION BY ds ORDER BY CAST(sumboxoffice AS DOUBLE) DESC) AS srank,boxoffice,irank FROM maxcompute_public_data.ods_product_movie_box WHERE ds>='20170128' AND ds<='20170203' )
,b as (SELECT movie_name,director,type ,area, actors,movie_language ,ROW_NUMBER() OVER (PARTITION BY movie_name ORDER BY TYPE DESC) AS nums FROM maxcompute_public_data.dwd_product_movie_basic_info WHERE ds>='20170128' AND ds<='20170203' )
,c as (SELECT b.movie_name,b.director,b.type ,b.area, b.actors,b.movie_language FROM b WHERE b.nums=1)
SELECT a.ds AS 放映日期
,a.moviename AS 影片名
,a.irank AS 当日票房排名
,a.boxoffice AS 当日票房万
,a.srank AS 总票房排名
,a.sumboxoffice AS 总票房万
,c.director AS 导演
,c.type AS 电影类型
,c.area AS 制片地区
,c.actors AS 主演
,c.movie_language AS 影片时长
FROM a
LEFT JOIN c
ON a.moviename = c.movie_name;
上述语句主要用了SQL的WITH AS 和JOIN语法。
- WITH AS是SQL子查询的一种语法,支持创建不同的临时表。
- JOIN语法的作用是合并表,有LEFT JOIN(左连接),RIGHT JOIN(右连接), INNER JOIN(内链接)
- ON一般配合JOIN使用,代替WHERE的功能,定义查询条件。
如代码所示,使用WITH AS 创建了a,b,c三个临时表,同时对三个表进行做链接,合并的条件是两个表的电影名称一致。
选中SQL语句,点击【运行】图标按钮。
实验总结:
本次实验主要对MaxCompute公共数据集电影票房数据进行数据预处理,实现通过SQL对数据进行数据清洗(条件筛选和空值处理)及数据转换(将具有相同属性的两条数据合并为一条数据),然后保存,方便后期对数据进行分析处理。
数据清洗主要依赖SQL进行驱动,实验中使用了基本的SELECT语法、WITH AS语法、JOIN语法,对SQL技能也会有所提升。