开发者社区> 上单> 正文

阿里云大数据利器Maxcompute学习之--分区表的使用

简介: 初学大数据Maxcompute时部分用户不是很熟悉Maxcompute分区表的概念和使用,那这篇文章来简单介绍下分区表的概念及使用场景。  实际上,分区在很多框架中都有这个概念,比如开源框架中的hive等。
+关注继续查看
初学大数据Maxcompute时部分用户不是很熟悉Maxcompute分区表的概念和使用,那这篇文章来简单介绍下分区表的概念及使用场景。
  实际上,分区在很多框架中都有这个概念,比如开源框架中的hive等。打个比喻,某城市粮仓里存放麦子,粮仓里按照县城分为很多区域,每个县城都有自己的一块地方,每个县城的麦子放在自己对应的区域上。如果上级领导来检查,想看某县城的麦子情况,那直接可以根据区域来迅速找到该县城的麦子。对应到Maxcompute分区表,粮仓相当于其中一张表,每个区域相当于以这个县城命名的分区。

一,分区表的概念
分区表指的是在创建表时指定分区空间,即指定表内的某几个字段作为分区列。在大多数情况下,用户可以将分区类比为文件系统下的目录。MaxCompute 将分区列的每个值作为一个分区(目录)。用户可以指定多级分区,即将表的多个字段作为表的分区,分区之间正如多级目录的关系。在使用数据时如果指定了需要访问的分区名称,则只会读取相应的分区,避免全表扫描,提高处理效率,降低费用。
使用示例:

建表: CREATE TABLE sd_data_test (
 userid STRING,
 shopid STRING,
 dtime DATETIME
)
PARTITIONED BY (
 part STRING,
 year STRING
)
LIFECYCLE 100000;

 
从其他表插入分区表:

insert into/overwrite table sd_data_test partition (part='450',year='2017') 
select xx, yy from sale_detail; 

 
查询:

select * from sd_data_test where part='543' AND year='2017'

 
这里查询的时候可以把分区字段当成普通字段来进行where条件的过滤。那插入后的数据是什么样子呢,可以在大数据开发套件中预览一下表结构




可以看到分区列相当于表中的字段,可以和表中的其他字段一样来使用。一般是放在where条件后抽取数据使用。
在表中实际的结构是什么样呢,其实分区相当于表中的子目录。那么如何查看呢,这里我使用odps的一个
eclipse插件下载表结构。安装eclipse插件可以参考https://help.aliyun.com/document_detail/27981.html?spm=5176.doc27800.6.756.04j9A9
调试代码时会下载表结构和小部分数据。sd_data_test的表结构如图:


  想必看到这个图就很清楚分区列和表字段的关系了。在查询的时候不会扫描全部表,而是去查某个分区目录下的数据,可以有效的提高查询效率。

二,静态分区,动态分区
静态分区和动态分区是对应的。所谓静态分区就是指在插入分区表的时候要指定分区值,比如上面例子

insert into/overwrite table sd_data_test partition (part='450',year='2017') 

 

这里指定的part和year的值,插入之前要指定具体的分区值。动态分区在插入前时候不指定,插入时指定源表的一个字段(多级分区指定多个),那么在插入的时候相同的字段值会自动创建成一个分区。

下面就介绍下动态分区具体的用法,假设一个场景用户有一年12个月的中国各个省份的数据资料。那想对这个表的数据进行分区,静态分区比较繁琐,可以使用动态分区。
假设 A表是源表非分区表,B表是分区表

CREATE TABLE A (
mon STRING,
pro STRING,
aa DATETIME,
bb STRING, cc STRING, dd STRING )

CREATE TABLE B(
xx1 STRING,
xx2 STRING,
xx3 DATETIME, xx4 STRING) PARTITIONED BY (month STRING,province STRING ) 动态插入,在select中指定按照哪两个字段(因为对应的分区列有两个)进行动态分区 。 insert into table B partition(month,province)select aa,bb,cc,dd,mon,pro from A mon,pro两个字段是动态分区的时候按照这两个字段进行分区,当然也可以按照一个分区列进行分区,但必须指定前面的高级分区列
例如 insert into table B partition(month=‘12’,province)select aa,bb,cc,dd, from A

三,odps分区的一些注意事项:

  • 目前,在使用动态分区功能的SQL中,在分布式环境下,单个进程最多只能输出512个动态分区,否则引发运行时异常;
  • 在现阶段,任意动态分区SQL不允许生成超过2000个动态分区,否则引发运行时异常;
  • 动态生成的分区值不允许为NULL,也不支持含有特殊字符和中文,否则会引发异常,如:“FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx”;
  • 如果目标表有多级分区,在运行insert语句时允许指定部分分区为静态,但是静态分区必须是高级分区;

还有一点就是如果动态分区,来源表数据量非常大并且分区字段数据分布不均匀容易产生数据倾斜问题,建议先做好规划,比如先将数据量非常大的那个分区值过滤随后静态分区单独插入。

总结:合理设置分区,可以大幅度提高查询速度降低使用费用,因为Maxcompute收费一部分来源于sql计算,设置分区表在计算时指定计算的分区,参与计算的数据不会扫描全表而是指定的部分分区表数据。
另外从计算性能上来说,如果分区数据过多了也会适得其反影响性能,甚至会超出Maxcompute的限制。所以合理使用分区表会给计算业务带来很好的优化效果。

 


有对大数据技术感兴趣的,可以加笔者的微信 wx4085116.目前笔者已经从阿里离职,博客不代表阿里立场。笔者开了一个大数据培训班。有兴趣的加我。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
浙江理工大学-阿里云“数据工程训练营”成功举行
2019年1月21日,浙江理工大学-阿里云“数据工程训练营”结营答辩在浙江理工大学下沙校区成功举行。作为由浙江理工大学与阿里云联合举办的为期10天的大数据实战训练营,举行结营答辩是为了检验40位同学们在集训期间的学习成果。
2328 0
9大训练营免费开营!阿里云大数据团队的独门绝学全在这了
即日起,阿里云大数据训练营九营齐开!理论与实践,概念与案例,大数据从0到1上手学习,行业大神真人带练!
2848 0
【Mysql】Mysql数据表区分大小写问题解决方案
原因 由于有的环境下,对数据表的大小写是明确区分的,但是我在导出的时候的数据表全部都是小写的,这个时候需要对环境进行配置 解决 vim /etc/my.cnf 在[mysqld]下加入一行:lower_case_table_names=1 service mysq...
715 0
分区表查询条件使用浅析
如果有个分区表,分区列为A、B、C三列,我要查询B列为某些值的数据,MaxCompute还能充分发挥分区表的优势吗?答案是肯定的,MaxCompute依然能发挥分区列的优势!在底层解析SQL执行计划时,只会将符合条件的分区纳入计算,而不是进行全表扫描。
1958 0
MaxCompute数据仓库在更新插入、直接加载、全量历史表三大算法中的数据转换实践
2018“MaxCompute开发者交流”钉钉群直播分享,由阿里云数据技术专家彬甫带来以“MaxCompute数据仓库数据转换实践”为题的演讲。本文首先介绍了MaxCompute的数据架构和流程,其次介绍了ETL算法中的三大算法,即更新插入算法、直接加载算法、全量历史表算法,再次介绍了在OLTP系统中怎样处理NULL值,最后对ETL相关知识进行了详细地介绍。
4884 0
+关注
上单
对大数据框架有浓厚兴趣,对阿里云产品使用,运维排查有经验,odps,dataworks,开放搜索等 喜欢技术分享交流
17
文章
0
问答
来源圈子
更多
作为全球云计算的领先者,阿里云为全球230万企业提供着云计算服务,服务范围覆盖200多个国家和地区。我们致力于为企业、政府等组织机构提供安全可靠的云计算服务,给用户带来极速愉悦的服务体验。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载