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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务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的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
2月前
|
SQL 存储 分布式计算
ODPS技术架构深度剖析与实战指南——从零开始掌握阿里巴巴大数据处理平台的核心要义与应用技巧
【10月更文挑战第9天】ODPS是阿里巴巴推出的大数据处理平台,支持海量数据的存储与计算,适用于数据仓库、数据挖掘等场景。其核心组件涵盖数据存储、计算引擎、任务调度、资源管理和用户界面,确保数据处理的稳定、安全与高效。通过创建项目、上传数据、编写SQL或MapReduce程序,用户可轻松完成复杂的数据处理任务。示例展示了如何使用ODPS SQL查询每个用户的最早登录时间。
120 1
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
人工智能 分布式计算 DataWorks
连续四年!阿里云领跑中国公有云大数据平台
近日,国际数据公司(IDC)发布《中国大数据平台市场份额,2023:数智融合时代的真正到来》报告——2023年中国大数据平台公有云服务市场规模达72.2亿元人民币,其中阿里巴巴市场份额保持领先,占比达40.2%,连续四年排名第一。
239 12
|
3月前
|
人工智能 Cloud Native 数据管理
重磅升级,阿里云发布首个“Data+AI”驱动的一站式多模数据平台
阿里云发布首个AI多模数据管理平台DMS,助力业务决策提效10倍
394 17
|
3月前
|
SQL 人工智能 大数据
阿里云牵头起草!首个大数据批流融合国家标准发布
近日,国家市场监督管理总局、国家标准化管理委员会正式发布大数据领域首个批流融合国家标准GB/T 44216-2024《信息技术 大数据 批流融合计算技术要求》,该标准由阿里云牵头起草,并将于2025年2月1日起正式实施。
97 7
|
3月前
|
SQL 人工智能 大数据
首个大数据批流融合国家标准正式发布,阿里云为牵头起草单位!
近日,国家市场监督管理总局、国家标准化管理委员会正式发布大数据领域首个批流融合国家标准 GB/T 44216-2024《信息技术 大数据 批流融合计算技术要求》,该标准由阿里云牵头起草,并将于2025年2月1日起正式实施。
|
3月前
|
存储 SQL 分布式计算
Java连接阿里云MaxCompute例
要使用Java连接阿里云MaxCompute数据库,首先需在项目中添加MaxCompute JDBC驱动依赖,推荐通过Maven管理。避免在代码中直接写入AccessKey,应使用环境变量或配置文件安全存储。示例代码展示了如何注册驱动、建立连接及执行SQL查询。建议使用RAM用户提升安全性,并根据需要配置时区和公网访问权限。具体步骤和注意事项请参考阿里云官方文档。
363 10
|
3月前
|
机器学习/深度学习 数据可视化 大数据
阿里云大数据的应用示例
阿里云大数据应用平台为企业提供高效数据处理与业务洞察工具,涵盖Quick BI、DataV及PAI等核心产品。DT203课程通过实践教学,帮助学员掌握数据可视化、报表设计及机器学习分析技能,提升数据驱动决策能力。Quick BI简化复杂数据分析,DataV打造震撼可视化大屏,PAI支持全面的数据挖掘与算法应用。课程面向CSP、ISV及数据工程师等专业人士,为期两天,结合面授与实验,助力企业加速数字化转型。完成课程后,学员将熟练使用阿里云工具进行数据处理与分析。[了解更多](https://edu.aliyun.com/training/DT203)
|
4月前
|
机器学习/深度学习 分布式计算 BI
MaxCompute 与阿里云其他服务的协同工作
【8月更文第31天】在当今的数据驱动时代,企业需要处理和分析海量数据以获得有价值的洞察。阿里云提供了一系列的服务来满足不同层次的需求,从数据存储到高级分析。MaxCompute(原名 ODPS)作为阿里云的大规模数据处理平台,提供了强大的计算能力和丰富的功能,可以与阿里云的其他服务无缝集成,形成完整的大数据解决方案。本文将探讨 MaxCompute 如何与其他阿里云服务协同工作,包括存储服务 OSS、数据分析服务 Quick BI 以及机器学习平台 PAI。
58 1
|
4月前
|
SQL 存储 分布式计算
MaxCompute 入门:大数据处理的第一步
【8月更文第31天】在当今数字化转型的时代,企业和组织每天都在产生大量的数据。有效地管理和分析这些数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个用于处理海量数据的大规模分布式计算服务。它提供了强大的存储能力以及丰富的数据处理功能,让开发者能够快速构建数据仓库、实时报表系统、数据挖掘等应用。本文将介绍 MaxCompute 的基本概念、架构,并演示如何开始使用这一大数据处理平台。
645 0