MaxComputer开发笔记之——sql

MaxCompute数据类型版本

MaxCompute设置数据类型版本属性的参数共有3个:

odps.sql.type.system.odps2:MaxCompute 2.0数据类型版本的开关,属性值为True或False。

odps.sql.decimal.odps2:MaxCompute 2.0的Decimal数据类型的开关,属性值为True或False。

odps.sql.hive.compatible:MaxCompute Hive兼容模式(即部分数据类型和SQL行为兼容Hive)数据类型版本的开关,属性值为True或False。

选择数据类型版本

项目选择的数据类型版本影响范围如下:

表的数据类型。

DML语句、内置函数的行为。

与MaxCompute密切相关的开发组件。

因此,在选择项目的数据类型版本前建议您了解各种版本的说明以及差异点

基础数据类型

类型常量示例描述

TINYINT    1Y、-127Y    8位有符号整型。

取值范围:-128~127。

SMALLINT32767S、-100S16位有符号整型。

取值范围:-32768~32767。

INT1000、-1564578732位有符号整型。

取值范围:-2 31 ~2 31 -1。

BIGINT100000000000L、-1L64位有符号整型。

取值范围:-2 63 +1~2 63 -1。

BINARY无二进制数据类型,目前长度限制为8MB。

FLOAT无32位二进制浮点型。

DOUBLE3.1415926 1E+764位二进制浮点型。

DECIMAL(precision,scale)3.5BD、99999999999.9999999BD10进制精确数字类型。

precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38。

scale:表示小数部分的位数。取值范围: 0 <= scale <= 18。

如果不指定以上两个参数,则默认为decimal(38,18)。

说明

同一个表中不能同时存在新老Decimal数据类型。

Decimal(precision, scale)类型在数据导入 (Tunnel Upload)和SQL运算过程中,如果数据的小数位数超过scale的大小,则会进行四舍五入的处理。如果整数部分超出限制,则会报错。

VARCHAR(n)无变长字符类型,n为长度。

取值范围:1~65535。

CHAR(n)无固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。

STRING“abc”、’bcd’、”alibaba”、‘inc’字符串类型,目前长度限制为8MB。

DATEDATE'2017-11-11'日期类型,格式为yyyy-mm-dd。

取值范围:0000-01-01~9999-12-31。

DATETIMEDATETIME ‘2017-11-11 00:00:00’日期时间类型。

取值范围:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精确到毫秒。

TIMESTAMPTIMESTAMP ‘2017-11-11 00:00:00.123456789’与时区无关的时间戳类型。

取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。

说明对于部分时区相关的函数,例如cast( as string),要求TIMESTAMP按照与当前时区相符的方式来展现。

BOOLEANTrue、FalseBOOLEAN类型。

取值范围:True、False。

PyODPS支持MaxCompute SQL的查询和读取执行结果。

入口对象的execute_sql()和run_sql()方法可以执行SQL语句,其返回值是任务实例。


对应关系

MaxCompute Type    Java Type

Tinyint         java.lang.Byte

Smallint       java.lang.Short

Int                 java.lang.Integer

Bigint             java.lang.Long

Float             java.lang.Float

Double             java.lang.Double

Decimal             java.math.BigDecimal

Boolean             java.lang.Boolean

String                 java.lang.String

Varchar             com.aliyun.odps.data.Varchar

Binary                 com.aliyun.odps.data.Binary

Datetime                 java.util.Date

Timestamp                 java.sql.Timestamp

Array                         java.util.List

Map                             java.util.Map

Struct                     com.aliyun.odps.data.Struct


组件

MaxCompute可以与多款阿里云产品组件集成使用,不同组件支持不同的数据类型。部分组件仅支持MaxCompute 1.0数据类型。

项目空间操作

use <project_name>;

进入指定的项目空间。进入该空间后可以直接操作该项目空间下的所有对象。用户需要有访问该项目空间的权限。

项目空间不存在或当前用户不属于此项目空间,则返回异常。

访问另一项目空间下的对象,需要指定项目空间名。

表操作

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [DEFAULT value] [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS] -- 用于创建Hash Clustering表时设置表的Shuffle和Sort属性。[STORED BY StorageHandler] -- 仅限外部表。[WITH SERDEPROPERTIES (Options)] -- 仅限外部表。[LOCATION OSSLocation]; -- 仅限外部表。[LIFECYCLE days][AS select_statement] CREATE TABLE [IF NOT EXISTS] table_name LIKE existing_table_name

表名、列名中不能有特殊字符。只能用英文小写字母(a-z)、英文大写字母(A-Z)、数字和下划线(_)且以字母开头。

创建表时,如果不指定if not exists选项而存在同名表,则返回出错。若指定此选项,则无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元信息不会被改动。

表名与列名均对大小写不敏感,不能有特殊字符,只能用英文的a-z、A-Z及数字和下划线_,且建议以字母开头,名称的长度不超过128字节。单表的列定义个数最多1200个。

DEFAULT value 指定列的默认值,当INSERT操作不指定该列时,该列写入默认值。

partitioned by指定表的分区字段,目前支持TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING类型。

分区值不允许有双字节字符(如中文),必须是以英文字母a-z、A-Z开始,后可跟字母或者数字,名称的长度不超过128字节。允许的字符包括:空格、冒号(:)、下划线(_)、美元符($)、井号(#)、点(.),感叹号(!)和(@),出现其他字符行为未定义,例如(\t)、(\n)、(/)等。当利用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,可以提高处理效率。

说明 一张表最多允许60000个分区,单表的分区层次不能超过6级。

注释内容是长度不超过1024字节的有效字符串。

LIFECYCLE是表的生命周期,单位:天。create table like语句不会复制源表的生命周期属性。

clustered by指定Hash Key。MaxCompute将对指定列进行Hash运算,按照Hash值分散到各个Bucket中。

为避免数据倾斜和热点,取得较好的并行执行效果,clustered by列适宜选择取值范围大,重复键值少的列。此外,为了达到join优化的目的,也应该考虑选取常用的Join/Aggregation Key,即类似于传统数据库中的主键。

sorted by用于指定在Bucket内字段的排序方式。建议sorted by和clustered by一致,以取得较好的性能。此外,当sorted by子句指定之后,MaxCompute将自动生成索引,并且在查询的时候利用索引来加快执行。

INTO number_of_buckets BUCKETS指定了哈希桶的数目。这个数字必须填写,且由数据量大小来决定。此外,缺省条件下MaxCompute只能支持最多1111个Reducer,所以此处最多也只支持1111个哈希桶。您可以使用set odps.sql.reducer.instances=xxx;来提升这个限制,但最大不得超过4000,否则会影响性能。

选择哈希桶数目时,请您遵循以下两个原则:

哈希桶大小适中:经验值是每个Bucket的大小在500M左右比较合理。例如,分区大小估计为500G,初略估算Bucket数目应该设为1000,这样平均每个Bucket大小约为500M。对于特别大的表,500M的限制可以突破,每个Bucket在2-3G左右比较合适。同时,可以结合set odps.sql.reducer.instances=xxx;来突破1111个桶的限制。

对于需要经常join的两个表,哈希桶数目应设为一样,这样才能够优化join,省略掉Shuffle和Sort步骤。如果按照上述原则计算两个表的哈希桶数不一致,建议统一使用数字大的Bucket Number,保证合理的并发度和执行效率。

Hash Clustering表的优点:

优化Bucket Pruning。

优化Aggregation。

优化存储。

Hash Clustering表的限制:

不支持insert into,只能通过insert overwrite来添加数据。

不支持Tunnel直接Upload到Range Cluster表,因为Tunnel上传数据是无序的。

MaxComputer的分表操作比较简单

通过create table...as select...语句再创建一个表,并在建表的同时将数据复制到新表中,如下所示。

create table sale_detail_ctas1 asselect * from sale_detail;

在create table...as select...语句中,如果在select子句中使用常量作为列的值,建议您指定列的名字。

如果希望源表和目标表具有相同的表结构,可以尝试使用create table...like操作,如下所示。

create table sale_detail_like like sale_detail;

但sale_detail中的数据不会被复制到sale_detail_like表中。

查看表信息

desc     <tableName>;

desc    extended     <tableName>;--查看外部表信息。

查看建表语句

查看建表语句的语法格式如下。

SHOW    CREATE    TABLE    <tableName>;

重命名表

重命名表的语法格式如下。

ALTER    TABLE    table_name    RENAME    TO    new_table_name;

其次alter关键字可以修改表中的其他很多信息,不列举

删除表

DROP TABLE [IF EXISTS] table_name;

查询属性(根据不同的需求查询)

SHOW    PARTITIONS    table_name;(根据分区查询)

添加列操作

ALTER TABLE table_name ADD COLUMNS (col_name1 type1,col_name2 type2...);



实例操作

这里的实例由任务生成。

MaxComputer的实例操作比较像是linux的进程操作,不详细描述


资源操作

关于资源的操作主要通过DataWorks中可视化的在线数据开发工具对资源进行搜索、上传等操作

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。