【实验】阿里云大数据助理工程师认证(ACA)- ACA认证配套实验-01-MaxCompute DML操作(下)

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 【实验】阿里云大数据助理工程师认证(ACA)- ACA认证配套实验-01-MaxCompute DML操作(下)

5.2 使用子句的查询


1)统计浙江省销量大于某量的销售城市排名 :

  select city,sum(amt) as total_amt
        from t_dml
           where province='浙江省'
            group by city
               having count(*)>1  and sum(amt) > 2000
               order by total_amt desc
             limit 10;  

20200711102656277.png

2)城市排名统计


  select city, cnt, amt
     from t_dml
     distribute by city
  sort by cnt;


20200711102723785.png


第 6 章:数据更新


6.1 追加记录


1) // insert into table: 追加插入

(提示:本部分使用到表dual ,上面的实验步骤 第3章3小节 已建立,如果未建立此表,请先执行如下语句建立此表:

  create table dual (X string);  ----创建此表
  insert into table dual select count(*) from dual;  ---插入一条数据,数值类型会自动转换
  select * from dual ;  ---检查数据
insert into table t_dml select -1,'1900-01-01 00:00:00','','',0,0,0 from dual;

20200711102819608.png

//检查结果


select * from t_dml where detail_id=-1;

20200711102844962.png

2)分区表数据操作


—添加分区:


alter table t_dml_p add if not exists partition (sale_date='2015-01-01');


—往分区添加数据:

insert into table t_dml_p partition (sale_date='2015-01-01')
                                       select -1, '', '', 0, 0, 0 from dual;

20200711102934541.png


检查数据,结果如图:


select * from t_dml_p where sale_date='2015-01-01' ;

20200711103001293.png


6.2 覆盖插入记录


1)覆盖插入非分区数据表:


 insert overwrite table t_dml
 select -2,'1900-01-01 00:00:00', '', '',0,0,0 from dual;
 select * from t_dml where detail_id in (-1,-2);

(为了编辑方便、直观,我们也可以到控制台上进行处理)如图:


20200711103053628.png


选中执行操作,执行插入语句,点击“运行”,出现下述系统检查SQL语法界面:

20200711103113611.png


检查无错误,点击“运行”,成功执行出现FINISH

查看结果:(执行选中检查语句 )


select * from t_dml where detail_id in (-1,-2);

20200711103157355.png

2)分区表数据操作 (依次执行下面的三个操作,添加分区、插入数据、检查分区表数据)


 alter table t_dml_p add if not exists partition (sale_date='2015-01-01');   --添加分区
        insert overwrite table t_dml_p partition (sale_date='2015-01-01')   --插入数据
                  select -2, '', '', 0, 0, 0 from dual;
        select * from t_dml_p where  sale_date='2015-01-01' ;  ---检查数据 


(说明:分区表一般需附带分区条件,避免全分区扫描,在操作未加分区条件的分区表时,MaxCompute提示告警 “full scan with all partitions” )

20200711103241664.png


3)清空分区表


使用覆盖插入的方式清空非分区表


insert overwrite table t_dml select * from t_dml where 1=2;  --清空操作

20200711103326726.png

count t_dml; --核查数据

4)使用覆盖插入的方式清空某个分区

 insert overwrite table t_dml_p partition(sale_date='2015-01-01')
           select detail_id, province, city, product_id, cnt, amt from t_dml_p where 1=2;
20200711103405843.png
select count(*) from t_dml_p where sale_date='2015-01-01';
20200711103435240.png


5) 也可以通过删除分区的方式清空分区

alter table t_dml_p drop if exists partition (sale_date='2015-01-01');
select count(*) from t_dml_p where sale_date='2015-01-01';

6)重新加载数据,准备下面的实验(命令示例:Tunnel upload –c GBK “自己的文件目录”\t_dml.csv t_dml ;)


20200711103531607.png

第 7 章:多路输出


7.1 实验场景


多路输出即在一个语句中插入不同的结果表或者分区,实验场景说明:


7.2 实验操作


1)增加分区,依次增加两个分区,操作如下

alter table t_dml_p add if not exists partition (sale_date='20150501');
       alter table t_dml_p add if not exists partition (sale_date='20150502');

2)创建实验临时表


创建表 create table t_dml_01 like t_dml;


3)将表t_dml中的数据按不同条件同时输出到新建的表和新建的t_dml_p的两个分区中

20200711103710217.png


参考语句

from t_dml
     insert into table t_dml_01
select detail_id,sale_date,province,city,product_id,cnt,amt
where detail_id > 5340000
insert overwrite table t_dml_p  partition (sale_date='20150501')
select detail_id,province,city,product_id,cnt,amt
 where sale_date >= '2015-05-01 00:00:00'
   and sale_date <= '2015-05-01 23:59:59'
insert overwrite table t_dml_p  partition (sale_date='20150502')
select detail_id,province,city,product_id,cnt,amt
 where sale_date >= '2015-05-02 00:00:00'
   and sale_date <= '2015-05-02 23:59:59' ;


第 8 章:动态分区


8.1 分区背景


动态分区即分区数值不是直接写死的,是由参数控制或数据中的实际数据控制的。

实际应用中通常会出现类似将表 t_dml 中的数据插入到分区表 t_dml_p中去的现象,由于分区个数多,不能手工逐个处理,太麻烦,需要动态分区。


8.2 分区实验


1)删除上步建立的分区:

alter table t_dml_p drop if exists partition (sale_date='20150501');
         alter table t_dml_p drop if exists partition (sale_date='20150502');

20200711103839598.png

2)利用动态分区直接完成数据插入:


insert into table t_dml_p partition(sale_date)
   select detail_id, province, city, product_id, cnt, amt,to_char(sale_date, 'yyyymmdd') as sale_date
     from t_dml;

3)利用overwrite 覆盖原来的分区

insert overwrite table t_dml_p partition(sale_date)
   select detail_id, province, city, product_id, cnt, amt,
 to_char(sale_date, 'yyyymmdd') as sale_date
     from t_dml;

第 9 章:join操作


9.1 加载实验数据


1)切换到客户端,切换至目录\ODPS_DEMO\resources\03-SQL(具体目录随自己而定),找到t_product_crt.sql文件,创建表,也可以直接将文件中的内容粘贴到控制台处理(或直接从附件下载实验文件)


(如果执行命令报找不到文件错误,建议执行命令写全路径,示例如下:


自己的目录\odpscmd –f 自己的目录\ODPS_DEMO\resources\03-SQL\t_product_crt.sql )

20200711103958978.png

执行结果如图:

20200711104019625.png

2) 加载数据 t_product.csv:进入交互界面,加载数据,如下图(目录为参考):

(命令示例: tunnel upload 自己的目录盘\ODPS_DEMO\resources\03-SQL\t_product.csv )

2020071110403926.png

9.2 join操作


1) 普通的JOIN操作

业务背景:事实表t_dml包含了销售记录信息,其中字段 product_id为产品标识,可以关联另一张维表t_product获得产品的说明信息,现在想通过SQL得到针对产品大类的销售金额统计:

   // 按照产品分类(category_name)统计销售金额
     //1-left outer join
select t2.category_name, sum(t1.amt)
              from t_dml t1
                   left outer join t_product t2
                         on t1.product_id=t2.product_id
                                group by t2.category_name;

20200711104127326.png


//2-inner join (join)

select t2.category_name, sum(t1.amt)
                          from t_dml t1
                                   inner join t_product t2
                                             on t1.product_id=t2.product_id
                                             group by t2.category_name;

2020071110420154.png

//3-right outer join


select t2.category_name, sum(t1.amt)
                        from t_dml t1
                      right outer join t_product t2
                      on t1.product_id=t2.product_id
                      group by t2.category_name;

20200711104230381.png

select t1.category_name, sum(t2.amt)
                                   from t_product t1
                                           right outer join t_dml t2
                                           on t1.product_id=t2.product_id
                                           group by t1.category_name;

20200711104256460.png

//4-full outer join


select t2.category_name, sum(t1.amt)
                                   from t_dml t1
                                   full outer join t_product t2
                                             on t1.product_id=t2.product_id
                                             group by t2.category_name;

20200711104327419.png


第 10 章:MapJoin HINT


10.1 场景介绍


由于各种原因,造成销售信息表 t_dml 中的记录存在一些质量问题,可能的问题包括:

1- 产品标识错误: 可以通过单价判断,单价相等的标识不同,则可能存在错误

2- 价格错误:如果销售记录中的平均单价高于产品维表中的定价,则可能存在问题

请协助发现这些可能存在问题的记录。


10.2 MapJoin HINT操作


1) left outer join 实现质量问题

 select /*+mapjoin(t2)*/t1.*,t1.amt/t1.cnt,t2.product_id,t2.price
      from t_dml t1
          left outer join t_product t2
            on t1.product_id<>t2.product_id
                 and t1.amt/t1.cnt = t2.price
                where t2.price is not null;

20200711104429762.png


2)inner join (join) 实现质量问题

 select /*+mapjoin(t1)*/ t1.*, t1.amt/t1.cnt,t2.product_id, t2.price
                 from t_dml t1
                    inner join t_product t2
                     on t1.product_id=t2.product_id
                     or t1.amt/t1.cnt - t2.price < 0.01;

20200711104500850.png


3)right outer join: 重写left outer join实现的逻辑

select /*+mapjoin(t1)*/t2.*,t2.amt/t2.cnt,t1.product_id,t1.price
                   from t_product t1
                           right outer join t_dml t2
                           on t1.product_id<>t2.product_id 
                          and t2.amt/t2.cnt = t1.price
                   where t1.price is not null;

20200711104527746.png

注意:在做关联时,如果关联条件比较复杂(比如包含 or 等连接条件)或者是关联条件中存在非等值关联(比如大于、小于或者不等于等),则普通的 join 无法实现,可以采用带有 mapjoin HINT 的 join 方式。


第 11 章:子查询


11.1 简单查询


ODPS SQL 支持将子查询作为一张表来用,可以用于简单查询、join等。在使用中,必须为子查询指定别名。

子查询用于简单查询,如:
        select * from (select distinct province from t_dml) t;
       执行结果:

20200711104613794.png

11.2 join子查询

1) 子查询用于join

 select t2.category_name, sum(t1.amt)
                  from (select * from t_dml where amt > 800) t1
                  inner join t_product t2
                  on t1.product_id=t2.product_id
                  group by t2.category_name;

20200711104653198.png

2) 子查询用于mapjoin


select /*+mapjoin(t1)*/t2.*,t2.amt/t2.cnt,t1.product_id,t1.price
                        from t_product t1
                        right outer join (select * from t_dml where detail_id > 5340000) t2
                        on t1.product_id=t2.product_id
                             and t2.amt/t2.cnt <> t1.price
                             where t1.price is not null;

20200711104721852.png


第 12 章:SQL联合与条件表达式


12.1 联合处理UNION ALL


在销售记录中,由于实际售卖价钱和产品的标称价并不一致,如果想获得产品的所有出现过的单价(包括实际售卖价和标称价),则采用如下语句处理:


 select * from (
               select product_id,price, 'STD' type from t_product
               UNION ALL
                select distinct product_id, amt/cnt as price, 'USED' type from t_dml
               ) t
              order by product_id,type,price desc
              limit 100;

20200711104759502.png

12.2 条件表达式CASE WHEN


如果市场部准备做一次市场营销活动,对于一次购买3-5个产品的,在目前的售价上实行9折优惠,一次购买6个及以上产品的,给与8折优惠。请基于5月份数据想评估一下此次活动的成本(为了简单可行,活动成本定义为目前销售额减掉优惠后的销售额)。则处理语句如下:

select sum(amt)-sum(case when cnt>=6 then amt*0.8
                  when cnt>=3 then amt*0.9
                 else amt
                  end) cost
        from t_dml;

20200711104839350.png

第 13 章:SQL执行结果的验证


13.1 简单SQL通过结果直接验证


简单SQL通过执行结果判定是否正确,如通过简单查询语句验证:

    如验证分区是否存在:
    select *  from t_dml_p where sale_date='20150501' ;

20200711104921457.png


数据显示,表明SQL正常执行。


13.2 复杂SQL验证


复杂SQL不容易理解或从结果中无法直接得到信息,采用逆向抽样的方法,如上述实验中涉及到的,利用动态分区快速插入数据

 insert into table t_dml_p partition(sale_date)
   select detail_id, province, city, product_id, cnt, amt,
to_char(sale_date, 'yyyymmdd') as sale_date
     from t_dml; 

1)先检查分区是否存在

2020071110500973.png

2)执行删除分区的操作


alter table t_dml_p drop if exists partition (sale_date='20150501');


20200711105036639.png


3)核查操作结果,则需要进行抽样验证,上步操作即检查删除的分区是否存在

如:


select * from t_dml_p where sale_date ='抽样数据'  (sale_date=‘20150101’)

20200711105106619.png

第 14 章:课后任务


14.1 课后任务


思考题 :


在常规的数据需求中,通常会遇到类似的统计查询,从一个千万级别甚至上亿级别的记录表中,将数据按不同条件分散到不同的表中,如按省份将各省数据分装到不同的表中,如果数据源表在MaxCompute中,采用哪种方式比较简单?相反如果统计所有省的数据,每个省数据放置在不同表中或不同分区中,考虑这样又如何做,效率如何?


课后练习:


假设一个学生期末考试成绩单,包含学号、课程、课程得分三列信息,请写出按每个课程的学生成绩排名?

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
2月前
|
SQL 人工智能 分布式计算
ODPS十五周年实录|构建 AI 时代的大数据基础设施
本文根据 ODPS 十五周年·年度升级发布实录整理而成,演讲信息如下: 张治国:阿里云智能集团技术研究员、阿里云智能计算平台事业部 ODPS-MaxCompute 负责人 活动:【数据进化·AI 启航】ODPS 年度升级发布
161 9
|
2月前
|
SQL 存储 分布式计算
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
本文旨在帮助非专业数据研发但是有高频ODPS使用需求的同学们(如数分、算法、产品等)能够快速上手ODPS查询优化,实现高性能查数看数,避免日常工作中因SQL任务卡壳、失败等情况造成的工作产出delay甚至集群资源稳定性问题。
1015 36
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
|
4月前
|
存储 分布式计算 大数据
【赵渝强老师】阿里云大数据存储计算服务:MaxCompute
阿里云MaxCompute是快速、全托管的TB/PB级数据仓库解决方案,提供海量数据存储与计算服务。支持多种计算模型,适用于大规模离线数据分析,具备高安全性、低成本、易用性强等特点,助力企业高效处理大数据。
238 0
|
2月前
|
存储 分布式计算 资源调度
【赵渝强老师】阿里云大数据MaxCompute的体系架构
阿里云MaxCompute是快速、全托管的EB级数据仓库解决方案,适用于离线计算场景。它由计算与存储层、逻辑层、接入层和客户端四部分组成,支持多种计算任务的统一调度与管理。
275 1
|
5月前
|
存储 缓存 分布式计算
OSS大数据分析集成:MaxCompute直读OSS外部表优化查询性能(减少数据迁移的ETL成本)
MaxCompute直读OSS外部表优化方案,解决传统ETL架构中数据同步延迟高、传输成本大、维护复杂等问题。通过存储格式优化(ORC/Parquet)、分区剪枝、谓词下推与元数据缓存等技术,显著提升查询性能并降低成本。结合冷热数据分层与并发控制策略,实现高效数据分析。
143 2
|
5月前
|
人工智能 分布式计算 大数据
构建AI时代的大数据基础设施-MaxCompute多模态数据处理最佳实践
本文介绍了大数据与AI一体化架构的演进及其实现方法,重点探讨了Data+AI开发全生命周期的关键步骤。文章分析了大模型开发中的典型挑战,如数据管理混乱、开发效率低下和运维管理困难,并提出了解决方案。同时,详细描述了MaxCompute在构建AI时代数据基础设施中的作用,包括其强大的计算能力、调度能力和易用性特点。此外,还展示了MaxCompute在多模态数据处理中的应用实践以及具体客户案例,最后提供了体验MaxFrame解决方案的方式。
651 2
|
4月前
|
人工智能 分布式计算 大数据
探索 ODPS:大数据时代的得力助手
在大数据蓬勃发展、 AI 技术席卷各行业的当下,阿里云 ODPS 作为大数据平台体系,凭借其强大的功能和广泛的应用,为众多从业者和企业带来了深远的影响。我有幸深入使用 ODPS,从中收获颇丰。
117 0
|
5月前
|
机器学习/深度学习 SQL 数据采集
大数据行业权威认证盘点:这些证书让你的简历更受大厂青睐
这些认证不仅能够为求职者提供有力的能力证明,更能帮助HR快速识别符合岗位要求的技术人才。对于希望进入大数据领域的从业者来说,选择适合自身职业规划的认证,将大大提升职业竞争力。
|
SQL 存储 分布式计算
ODPS技术架构深度剖析与实战指南——从零开始掌握阿里巴巴大数据处理平台的核心要义与应用技巧
【10月更文挑战第9天】ODPS是阿里巴巴推出的大数据处理平台,支持海量数据的存储与计算,适用于数据仓库、数据挖掘等场景。其核心组件涵盖数据存储、计算引擎、任务调度、资源管理和用户界面,确保数据处理的稳定、安全与高效。通过创建项目、上传数据、编写SQL或MapReduce程序,用户可轻松完成复杂的数据处理任务。示例展示了如何使用ODPS SQL查询每个用户的最早登录时间。
1597 1
|
8月前
|
存储 分布式计算 运维
课时6:阿里云MaxCompute:轻松玩转大数据
阿里云MaxCompute是全新的大数据计算服务,提供快速、完全托管的PB级数据仓库解决方案。它拥有高效的压缩存储技术、强大的计算能力和丰富的用户接口,支持SQL查询、机器学习等高级分析。MaxCompute兼容多种计算模型,开箱即用,具备金融级安全性和灵活的数据授权功能,帮助企业节省成本并提升效率。
291 0
下一篇
oss云网关配置