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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*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的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
27天前
|
分布式计算 搜索推荐 物联网
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
|
27天前
|
人工智能 分布式计算 架构师
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
|
27天前
|
机器学习/深度学习 搜索推荐 算法
飞天大数据平台产品问题之AIRec在阿里巴巴飞天大数据平台中的功能如何解决
飞天大数据平台产品问题之AIRec在阿里巴巴飞天大数据平台中的功能如何解决
|
1月前
|
存储 机器学习/深度学习 数据采集
深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用
深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用
|
20天前
|
SQL 存储 分布式计算
MaxCompute 入门:大数据处理的第一步
【8月更文第31天】在当今数字化转型的时代,企业和组织每天都在产生大量的数据。有效地管理和分析这些数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个用于处理海量数据的大规模分布式计算服务。它提供了强大的存储能力以及丰富的数据处理功能,让开发者能够快速构建数据仓库、实时报表系统、数据挖掘等应用。本文将介绍 MaxCompute 的基本概念、架构,并演示如何开始使用这一大数据处理平台。
113 0
|
2月前
|
SQL 分布式计算 MaxCompute
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
|
1月前
|
SQL 分布式计算 大数据
"大数据计算难题揭秘:MaxCompute中hash join内存超限,究竟该如何破解?"
【8月更文挑战第20天】在大数据处理领域,阿里云的MaxCompute以高效稳定著称,但复杂的hash join操作常导致内存超限。本文通过一个实例解析此问题:数据分析师小王需对两个共计300GB的大表进行join,却遭遇内存不足。经分析发现,单个mapper任务内存默认为2GB,不足以支持大型hash表的构建。为此,提出三种解决方案:1) 提升mapper任务内存;2) 利用map join优化小表连接;3) 实施分而治之策略,将大表分割后逐一处理再合并结果。这些方法有助于提升大数据处理效率及稳定性。
48 0
|
1月前
|
SQL 分布式计算 大数据
"揭秘MaxCompute大数据秘术:如何用切片技术在数据海洋中精准打捞?"
【8月更文挑战第20天】在大数据领域,MaxCompute(曾名ODPS)作为阿里集团自主研发的服务,提供强大、可靠且易用的大数据处理平台。数据切片是其提升处理效率的关键技术之一,它通过将数据集分割为小块来优化处理流程。使用MaxCompute进行切片可显著提高查询性能、支持并行处理、简化数据管理并增强灵活性。例如,可通过SQL按时间或其他维度对数据进行切片。此外,MaxCompute还支持高级切片技术如分区表和分桶表等,进一步加速数据处理速度。掌握这些技术有助于高效应对大数据挑战。
56 0
|
2月前
|
分布式计算 资源调度 DataWorks
MaxCompute操作报错合集之出现“查询运行日志失败”的报错,一般是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
2月前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之编写UDF(用户自定义函数)时,报错:找不到主类,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。

热门文章

最新文章