生活宝|商城|团购|房产|招聘|外卖|交友|微博|汽车|同城|游戏|贷款|发稿|建站|软件|客服
上海论坛

MaxCompute - ODPS重装上阵 第二弹 - 新的基本数据类型与内建函数

更新于 7 天前 355人阅读 0人回复 显示全部楼层 倒序浏览

a
0 0
  @ME:   
  • TA的每日心情
    慵懒
    昨天 11:58
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 7 天前 | 显示全部楼层 |阅读模式
    53快服 销量提升50%

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?快速注册

    x
    摘要: MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外,也致力于提升SQL语言的用户体验和表达能力,提高广大ODPS开发者的生产力。
    MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外,也致力于提升SQL语言的用户体验和表达能力,提高广大ODPS开发者的生产力。
    MaxCompute基于ODPS2.0新一代的SQL引擎,显著提升了SQL语言编译过程的易用性与语言的表达能力。我们在此推出MaxCompute(ODPS2.0)重装上阵系列文章
    上次向您介绍了 [编译器的易用性改进] https://yq.aliyun.com/articles/225028),这次向您介绍新的基本数据类型与内建函数
    原ODPS只有六种基本数据类型, bigint, double, decimal, string, datetime, boolean。一般用起来也还够用,但是在某些场景下就不够了
    场景1
    一个项目需要将原来在SQL SERVER上面运行的ETL系统,最近因为数据量暴涨,需要迁移到MaxCompute。发现某些表用了VARCHAR,有的用了INT。这些类型也被系统的多处SQL脚本用到还参与了运算。迁移到ODPS上时候,用STRING代替VARCHAR,用BIGINT代替INT ( 注1 )。
    迁移完成后发现数据和原有系统对不上,是不是VARCHAR的截断,INT的溢出行为导致数据不同呢?还是什么其他原因,面对着现存系统,没办法,只好一点点看代码,跑数据,做分析。本来以为挺轻松的项目,花了几周时间才搞定。。。
    场景2
    我的项目需要存放二进制数据到表中,因为是语音识别项目,每小段采集的音频如果作为一个字段存下去,然后用个UDF处理起来很方便。可是,ODPS没有BINARY数据类型,好吧,就存成STRING好了。可是编写写UDF时候好麻烦,为了存进去,必须将byte[]编码成string, 读的时候又必须解码,代码写了一大堆,运行速度也慢了好多。。。
    MaxCompute采用基于ODPS2.0的SQL引擎,大幅度扩充了基本类型并提供了配套的内建函数,基本解决了上述问题。
    基本类型的扩充
    此文中采用MaxCompute Studio作展示,首先,安装MaxCompute Studio,导入测试MaxCompute项目,创建工程,建立一个新的MaxCompute脚本文件, 如下
    运行后,建立另一个文件插入数据,如下:
    运行后,可以在MaxCompute Studio的Project Explorer中找到新创建的表,察看表的详细信息,并预览数据,如下图

    可以看到
    创建表的时候,首先指定使用MaxCompute新类型系统,因为兼容性的考虑,需要您主动打开这个设定。也可以在MaxCompute Studio中缺省指定,如下图

    MaxCompute Studio支持含新类型表数据的导入导出,可参考此ATA文章
    如果不使用MaxCompute Studio,可以在脚本中指定,set odps.sql.type.system.odps2=true;。Studio实际上在后台也是使用这个开关来控制是否启用新类型。odps.sql.type.system.odps2设定为true的时候,除了可以使用新类型,也控制其它方面的一些行为改变。将在相关部分说明。
    如果需要在MaxCompute 项目中缺省打开,可以联系您的项目管理员,在项目模板中设定。
    扩充后MaxCompute支持的基本数据类型如下表,新增类型有TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, BINARY。


    新的隐式转换规则表如下表 ( 注5 )
    boolean
    tinyint
    smallint
    int
    bigint
    float
    double
    decimal
    string
    varchar
    timestamp
    binary

    boolean toTRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
    tinyint toFALSETRUETRUETRUETRUETRUETRUETRUETRUETRUEFALSE
    smallint toFALSEFALSETRUETRUETRUETRUETRUETRUETRUETRUEFALSE
    int toFALSEFALSEFALSETRUETRUETRUETRUETRUETRUETRUEFALSE
    bigint toFALSEFALSEFALSEFALSETRUETRUETRUETRUETRUETRUEFALSE
    float toFALSEFALSEFALSEFALSEFALSETRUETRUETRUETRUETRUEFALSE
    double toFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUETRUEFALSE
    decimal toFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUEFALSE
    string toFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUETRUEFALSE
    varchar toFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUETRUEFALSE
    timestamp toFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUE
    binary toFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
    此外,还新增了DECIMAL类型与DATETIME的常量定义方式, 100BD就是数值为100的DECIMAL,datetime ‘2017-11-11 00:00:00’就是个datetime类型的常量。常量定义的方便之处在于可以直接用到values子句和values表中,以后会单独介绍。
    内建函数的扩充
    任何编程语言,包括SQL,不管语言本身多强大,如过没有丰富的函数后者类库支持,在应用的时候还是会很不方便,MaxCompute配合新数据类型,大大丰富了内建函数,如下:
    数学函数
    log2, log10, bin, hex, unhex, degrees, radians, sign, e, pi, factorial, cbrt, shiftleft, shiftright, shiftrightunsigned
    日期函数
    unix_timestamp, year, quarter, month, day, dayofmonth, hour, minute, second, millisecond, nanosecond, from_utc_timestamp, current_timestamp, add_months, last_day, next_day, months_between
    字符串函数
    concat_ws, lpad, rpad, replace, soundex, substring_index, base64, unbase64
    聚合函数
    corr
    这些函数大部分与Hive的内建函数兼容,用法可以直接参考Hive的文档。与Hive不同的是MaxCompute提供的这些函数都是用本地代码实现的高效版本。
    新增的TIMESTAMP数据类型支持纳秒级别的精度,与之配合,新增了MaxCompute特有的millisecond, nanosecond函数,可以取出TIMESTAMP, DATETIME的毫秒部分与TIMESTAMP的纳秒部分。
    如本系列上一篇中提到的,MaxCompute支持新的强制转换写法,例如,要强制bigint变量为转换为string,可以直接写string(a_bigint), 和写成cast(a_bigint as string)是等效的。具体用哪种形式完全取决于您的偏好。
    需要注意的是所有用来支持新类型的函数,例如current_timestamp,也需要设定set odps.sql.type.system.odps2=true;,否则会报告编译错误。


    您需要登录后才可以回帖 登录 | 快速注册

    本版积分规则

    品牌广播台 更多>>
    便民工具
    返回顶部快速回复返回列表联系客服手机访问
    关于我们 | 联系我们 | 广告服务 | 网站导航 | 诚聘英才 | 友情链接 | 免责申明 |  帮助中心 | 手机访问 | 排行榜 | 小黑屋 | 设首页 | 加收藏
    © 2011-2017 上海论坛 版权所有 沪ICP备11017971号-7    在线客服 举报 郑重声明:本站只提供网上自由交流讨论,所有个人言论并不代表本站立场
    快速回复 返回顶部 返回列表