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

简介: 【实验】阿里云大数据助理工程师认证(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;
目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI操作报错合集之在ODPS的xxx_dev项目空间调用easyrec训练,需要访问yyy项目空间的OSS,出现报错,是什么导致的
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
7天前
|
分布式计算 安全 大数据
MaxCompute操作报错合集之创建oss外部表时出现了报错:"Semantic analysis exception - external table checking failure, error message:,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
7天前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之在本地用tunnel命令上传excel表格到mc遇到报错: tunnel upload C:\Users***\Desktop\a.xlsx mc里的非分区表名 -s false;该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
7天前
|
存储 分布式计算 大数据
MaxCompute操作报错合集之通过UDF调用异常(其他使用http调用正常)。报错:java.lang.NoSuchMethodError:是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
7天前
|
SQL 分布式计算 Java
MaxCompute操作报错合集之查询外部表insert到内部表报错,两表字段一致,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
7天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之出现报错:invalid dynamic partition value: \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
8天前
|
分布式计算 DataWorks 大数据
MaxCompute产品使用合集之odps.sql.mapper.split.size和odps.stage.mapper.split.size这两个参数的区别是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8天前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之在ODPS中,如何将日期时间与8小时进行拼接
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8天前
|
存储 分布式计算 大数据
MaxCompute操作报错合集之自定义udf的函数,引用了import net.sourceforge.pinyin4j.PinyinHelper;但是上传资源后,出现报错,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
8天前
|
分布式计算 DataWorks 大数据
MaxCompute操作报错合集之怎么把业务流程中的表结构链接更新
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。

热门文章

最新文章