大家好,今天小编来为大家解答大数据开发全攻略:初学者必看指南这个问题,很多人还不知道,现在让我们一起来看看吧!
笔者不才,有任何错误纰漏,欢迎大家指正。
基础功能介绍
▐功能分类
一般来说,数据开发包括了以下几个类型:
▐MaxCompute功能
在此,我们重点介绍一下其中MaxCompute模块(MaxCompute是适用于数据分析场景的企业级SaaS模式云数据仓库)的功能:
基础SQL▐DDL
具体语句1:
--创建新表。 create [external] table [if not exists]参数说明:
external:可选。表示创建的表为外部表。
if not exists:可选。如果不指定if not exists选项而存在同名表,会报错。
table_name:必填。表名。
primary key(pk):可选。表的主键。
col_name:可选,表的列名。
col_comment:可选。列的注释内容。
data_type:可选。列的数据类型。
not null:可选。禁止该列的值为NULL。default_value:可选。指定列的默认值。
table_comment:可选。表注释内容。
lifecycle:可选。表的生命周期。
partitioned by (
具体语句2:修改表的所有人
alter table参数说明:
table_name:必填。待修改Owner的表名。
new_owner:必填。修改后的Owner账号。如果要修改Owner为RAM用户,格式为:RAMlt;UID>:
具体语句3:修改表的注释
alter table参数说明:
table_name:必填。待修改注释的表的名称。
new_comment:必填。修改后的注释名称。
具体语句4:修改表的修改时间
alter table参数说明:
table_name:必填。待修改表的修改时间的表名称。
具体语句5:重命名表
alter table参数说明:
table_name:必填。待修改名称的表。
new_table_name:必填。修改后的表名称。如果已存在与new_table_name同名的表,会返回报错。
具体语句6:删除表
drop table [if exists]参数说明:
if exists:可选。如果不指定if exists且表不存在,则返回异常。如果指定if exists,无论表是否存在,均返回成功。
table_name:必填。待删除的表名。
具体语句7:查看表或视图信息
--查看表或视图信息。desc参数说明:
table_name:必填。待查看表的名称。
view_name:必填。待查看视图的名称。
pt_spec:可选。待查看分区表的指定分区。
extended:如果表为外部表、聚簇表或Transactional表,需要包含此参数。
具体语句8:查看分区信息
desc参数说明:
table_name:必填。待查看分区信息的分区表名称。
pt_spec:必填。待查看的分区信息。
具体语句9:查看建表语句
show create table参数说明:
table_name:必填。待查看建表语句的表的名称。
具体语句10:列出所有分区
show partitions参数说明:
table_name:必填。待查看分区信息的分区表名称。
具体语句11:清空列数据
ALTER TABLE参数说明:
table_name:将要执行清空列数据的表名称。
column1 , column2...:将要被清空数据的列名称。
partition:指定分区。
pt_spec:分区描述。
without touch:表示不更新LastDataModifiedTime。
src_project_name:可选。源表所属MaxCompute项目名称。
src_table_name:必填。源表名称。
pt_spec:可选。源表的分区信息。
dest_project_name:可选。
dest_table_name:必填。目标表名称。
▐DML
具体语句1:插入或覆写数据
--插入:直接向表或静态分区中插入数据,可以在insert语句中直接指定分区值,将数据插入指定的分区。如果您需要插入少量测试数据,可以配合VALUES使用。--覆写:先清空表或静态分区中的原有数据,再向表或静态分区中插入数据。insert {into|overwrite} table参数说明:
table_name:必填。需要插入数据的目标表名称。
pt_spec:可选。需要插入数据的分区信息。
col_name:可选。需要插入数据的目标表的列名称。
select_statement:必填。select子句,从源表中查询需要插入目标表的数据。
zorder by
具体语句2:插入或覆写动态分区数据
--在使用MaxCompute SQL处理数据时,分区列的值在select子句中提供,系统自动根据分区列的值将数据插入到相应分区。insert {into|overwrite} table参数说明:
table_name:必填。需要插入数据的目标表名。
ptcol_name:必填。目标表分区列的名称。
select_statement:必填。select子句,从源表中查询需要插入目标表的数据。
具体语句3:更新或删除数据
--删除操作:用于删除Transactional或Delta Table表中满足指定条件的单行或多行数据。delete from参数说明:
table_name:必填。
where_condition:可选。WHERE子句,用于筛选满足条件的数据。
partition:指定分区,若未指定,则表示操作所有分区。
pt_spec:分区描述。
without touch:表示不更新LastDataModifiedTime。
col1_name、col2_name:待修改行对应的列名称。
value1、value2:至少更新一个列值。修改后的新值。
where_condition:可选。WHERE子句,用于筛选满足条件的数据。
additional_tables:可选,from子句。
具体语句4:merge into
merge into参数说明:
target_table:必填。目标表名称,必须是实际存在的表。
alias_name_t:必填。目标表的别名。
source expression|table_name:必填。关联的源表名称、视图或子查询。
alias_name_s:必填。关联的源表、视图或子查询的别名。
boolean expression1:必填。BOOLEAN类型判断条件,判断结果必须为True或False。
boolean expression2:可选。update、delete、insert操作相应的BOOLEAN类型判断条件。
set_clause_list:当出现update操作时必填。
value_list:当出现insert操作时必填。
具体语句5:Values
--insert … valuesinsert into table参数说明:
table_name:必填。待插入数据的表名称。
pt_spec:可选。需要插入数据的目标分区信息。
col_name:可选。需要插入数据的目标列名称。
col_value:可选。目标表中列对应的列值。
具体语句6:Load
--将Hologres、OSS、Amazon Redshift、BigQuery外部存储的CSV格式或其他开源格式数据导入MaxCompute的表或表的分区。{load overwrite|into} table参数说明:
table_name:必填。需要插入数据的目标表名称。
pt_spec:可选。需要插入数据的目标表分区信息。
external_location:必填。指定读取外部存储数据的OSS目录。
StorageHandler:必填。指定内置的StorageHandler名称。
Options:可选。指定外部表相关参数。
具体语句7:Unload
--将MaxCompute的数据导出至OSS、Hologres外部存储,OSS支持以CSV格式或其他开源格式存储数据。unload from {参数说明:
select_statement:select查询子句,
table_name、pt_spec:使用表名称或表名称加分区名称的方式指定需要导出的数据。
external_location:必填。
StorageHandler:必填。指定内置的StorageHandler名称。
具体语句8:Explain
--分析查询语句或表结构来分析性能瓶颈explain参数说明:
dml query:必填。select语句。
具体语句9:公用表表达式
--临时命名结果集,用于简化SQL,可以更好地提高SQL语句的可读性与执行效率with参数说明:
cte_name:必填。CTE的名称,不能与当前with子句中的其他CTE的名称相同。查询中任何使用到cte_name标识符的地方,均指CTE。
cte_query:必填。一个select语句。select的结果集用于填充CTE。
▐DQL
- SELECT语句
1. SELECT语法
[with下面将介绍SELECT命令格式及如何实现嵌套查询、分组查询、排序等操作。
2. SELECT语序
--语法顺序from场景1:from->where->group by->having->select->order by->limit
场景2:from->where->select->distribute by->sort by
3. WITH子句
with A as (SELECT 1 as C),B as (SELECT * from A) SELECT * from B;在同一WITH子句中的CTE必须具有唯一的名字。
在WITH子句中定义的CTE仅对在同一WITH子句中的其他CTE可以使用。
4. 列表达式
------------------------------------------------------------------------------例子 --读取表xxxx_detail的列shop_nameSELECT xxxx_name from xxxx_detail;--查询表xxxx_detail中region列数据,如果有重复值时仅显示一条。SELECT distinct region from xxxx_detail;--选出xxxx_detail表中列名不为xxxx_name的所有列SELECT `(xxxx_name)?+.+` from xxxx_detail;--去重多列时,distinct的作用域是SELECT的列集合,不是单个列。SELECT distinct region, xxxx_date from xxxx_detail;用列名指定要读取的列。
用星号(*)代表查询所有的列。
可以使用正则表达式。
在选取的列名前可以使用distinct去掉重复字段,只返回去重后的值。
5. 排除列
--读取xxxx_detail表的数据,并排除region列的数据。------------------------------------------------------------------------------例子SELECT * except(region) from xxxx_detail;当希望读取表内大多数列的数据,同时要排除表中少数列的数据时。
表示读取表数据时会排除指定列(col1、col2)的数据。
6. WHERE
--配合关系运算符,筛选满足指定条件的数据。关系运算符包含: >、<、=、>=、<=、<>like、rlike in、not in between…and------------------------------------------------------------------------------例子SELECT * from xxxx_detailwhere xxxx_date >= '2008' and xxxx_date<= '2014';--等价于如下语句。SELECT * from xxxx_detail where xxxx_date between '2008' and '2014';where子句为过滤条件。如果表是分区表,可以实现列裁剪。
7. GROUP BY
------------------------------------------------------------------------------例子--直接使用输入表列名region作为group by的列,即以region值分组SELECT region from xxxx_detail group by region;--以region值分组,返回每一组的销售额总量。SELECT sum(xxxx_price) from xxxx_detail group by region;--以region值分组,返回每一组的region值(组内唯一)及销售额总量。SELECT region, sum (xxxx_price) from xxxx_detail group by region;group by操作优先级高于SELECT操作,因此group by的取值是SELECT输入表的列名或由输入表的列构成的表达式。需要注意的是:
group by取值为正则表达式时,必须使用列的完整表达式。
SELECT语句中没有使用聚合函数的列必须出现在GROUP BY中。
8. HAVING
------------------------------------------------------------------------------例子--为直观展示数据呈现效果,向sale_detail表中追加数据。insert into sale_detail partition (sale_date='2014', region='shanghai') values ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);--使用having子句配合聚合函数实现过滤。SELECT region,sum(total_price) from sale_detail group by region having sum(total_price)<305;通常HAVING子句与聚合函数一起使用,实现过滤。
9. ORDER BY
------------------------------------------------------------------------------例子--查询表xxxx_detail的信息,并按照xxxx_price升序排列前2条。SELECT * from xxxx_detail order by xxxx_price limit 2;--将表xxx_detail按照xxxx_price升序排序后,输出从第3行开始的3行数据。SELECT xxxx_id,xxxx_price from xxxx_detail order by xxxx_price limit 3 offset 2;默认对数据进行升序排序,如果降序排序,需要使用desc关键字。
order by默认要求带limit数据行数限制,没有limit会返回报错。
10. DISTRIBUTE BY哈希分片
------------------------------------------------------------------------------例子--查询表xxxx_detail中的列region值并按照region值进行哈希分片。SELECT region from xxxx_detail distribute by region;--等价于如下语句。SELECT region as r from xxxx_detail distribute by region;SELECT region as r from xxxx_detail distribute by r;distribute by控制Map(读数据)的输出在Reducer中是如何划分的,如果不希望Reducer的内容存在重叠,或需要对同一分组的数据一起处理,可以使用distribute by来保证同组数据分发到同一个Reducer中。
11. SORT BY局部排序
------------------------------------------------------------------------------例子--查询表xxxx_detail中的列region和xxxx_price的值并按照region值进行哈希分片,然后按照xxxx_price对哈希分片结果进行局部升序排序。SELECT region,xxxx_price from xxxx_detail distribute by region sort by xxxx_price;--查询表xxxx_detail中的列region和xxxx_price的值并按照region值进行哈希分片,然后按照xxxx_price对哈希分片结果进行局部降序排序。SELECT region,xxxx_price from xxxx_detail distribute by region sort by xxxx_price desc;--如果sort by语句前没有distribute by,sort by会对每个Reduce中的数据进行局部排序。SELECT region,xxxx_price from xxxx_detail sort by xxxx_price desc;sort by默认对数据进行升序排序,如果降序排序,需要使用desc关键字。
如果sort by语句前有distribute by,sort by会对distribute by的结果按照指定的列进行排序。
12. LIMIT限制输出行数
SELECT * FROM xxxxx.xxxx_xxxx_xxxxWHERE ds = 20240520LIMIT 100;limit
- 子查询
1. 基础子查询
--格式1select普通查询操作的对象是目标表,但是查询的对象也可以是另一个select语句,这种查询为子查询。在from子句中,子查询可以被当作一张表,与其他表或子查询进行join操作。
2. IN SUBQUERY
--in subquery与left semi join用法类似--格式一selectselect_expr1:必填。格式为col1_name, col2_name, 正则表达式,...,表示待查询的普通列、分区列或正则表达式。
table_name1、table_name2:必填。表的名称。
select_expr2、select_expr3:必填。表示table_name1和table_name2互相映射的列名。
col_name:必填。表的列名。
3. NOT IN SUBQUERY
--如果查询目标表的指定列名中有任意一行为NULL,则not in表达式值为NULL,导致where条件不成立,无数据返回selectselect_expr1:必填。格式为col1_name, col2_name, 正则表达式,...,表示待查询的普通列、分区列或正则表达式。
table_name1、table_name2:必填。表的名称。
select_expr2、select_expr3:必填。表示table_name1和table_name2互相映射的列名。
col_name:必填。表的列名。
4. EXISTS SUBQUERY
--使用exists subquery时,当子查询中有至少一行数据时,返回True,否则返回False。selectselect_expr:必填。格式为col1_name, col2_name, 正则表达式,...,表示待查询的普通列、分区列或正则表达式。
table_name1、table_name2:必填。表的名称。
col_name:必填。表的列名。
5. NOT EXISTS SUBQUERY
--当子查询中无数据时,返回True,否则返回Falseselectselect_expr:必填。格式为col1_name, col2_name, 正则表达式,...,表示待查询的普通列、分区列或正则表达式。
table_name1、table_name2:必填。表的名称。
col_name:必填。表的列名。
6. SCALAR SUBQUERY
--当子查询的输出结果为单行单列时,可以做为标量使用,即可以参与标量运算。select