ODPS SQL采用类似SQL的语法,适用于海量数据(TB级)但实时性要求不高的分布式处理场景。

前提条件

您在工作空间配置页面添加MaxCompute计算引擎实例后,当前页面才会显示MaxCompute目录。详情请参见配置工作空间

背景信息

因为每个作业从前期准备到提交等阶段都需要花费较长时间,因此如果要求处理几千至数万笔事务的业务,您可以使用ODPS SQL顺利完成。ODPS SQL是主要面向吞吐量的OLAP应用,详情请参见与标准SQL的主要区别及解决方法

ODPS SQL节点的使用限制如下:
  • ODPS SQL不支持单独使用set、use和alias语句,必须和具体的SQL语句一起执行,示例如下。
    set a=b;
    create table name(id string);
  • ODPS SQL不支持关键字(set、use和alias)语句后单独加注释,示例如下。
    create table name(id string);
    set a=b; //注释,不支持该注释。
    create table name1(id string);
  • 数据开发与调度运行的区别如下:
    • 数据开发:合并当前任务代码内所有的关键字(set、use和alias)语句,作为所有SQL的前置语句。
    • 调度运行:按照顺序执行。
    set a=b;
    create table name1(id string);
    set c=d;
    create table name2(id string);
    运行结果如下表所示。
    执行SQL 数据开发 调度运行
    第一条SQL语句
    set a=b;
    set c=d;
    create table name1(id string);
    set a=b;
    create table name1(id string);
    第二条SQL语句
    set a=b;
    set c=d;
    create table name2(id string);
    set c=d;
    create table name2(id string);
  • 调度参数配置必须是key=value的格式,且(=)前后不支持空格,示例如下。
    time={yyyymmdd hh:mm:ss} //错误
    a =b //错误
  • 如果设置bizdatedate等关键字作为调度参数变量,格式必须是yyyymmdd。如果需要其它格式,请使用其它变量名称,避免冲突,示例如下。
    bizdate=201908 //错误,不支持。
  • 数据开发需要查询结果,仅支持select、read和with起始的SQL语句,否则无结果输出。
  • 执行多条SQL语句时,请用分号(;)分隔,且需要换行。
    • 错误示例
      create table1;create table2
    • 正确示例
      create table1;
      create table2;
  • MaxCompute 2.0扩展函数使用到新数据类型时,您需要在该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。

操作步骤

  1. 进入数据开发页面。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击工作空间列表
    3. 选择工作空间所在地域后,单击相应工作空间后的进入数据开发
  2. 鼠标悬停至新建图标,单击MaxCompute > ODPS SQL
    您也可以找到相应的业务流程,右键单击MaxCompute,选择新建 > ODPS SQL
  3. 新建节点对话框中,输入节点名称,并选择目标文件夹
    说明 节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。
  4. 单击提交
  5. 在节点的编辑页面,编辑并运行代码。
    新建节点成功后,编写符合语法的ODPS SQL代码,SQL语法请参见SQL概述
    说明 由于国际标准化组织发布的中国时区信息调整,通过DataWorks执行相关SQL时,日期显示某些时间段会存在时间差异:1900~1928年的日期时间差异5分52秒,1900年之前的日期时间差异9秒。
    DataWorks不允许节点代码中仅包含set语句。如果您需要运行SET语句,可以和其它SQL语句一起执行,如下所示。
    setproject odps.sql.allow.fullscan=true;
    select 1;

    SET语句的详情请参见SET操作

    以创建一张表并向表中插入数据,查询结果为例,操作如下:

    1. 创建一张表test1
      CREATE TABLE IF NOT EXISTS test1 
      ( id BIGINT COMMENT '' ,
        name STRING COMMENT '' ,
        age BIGINT COMMENT '' ,
        sex STRING COMMENT '');
    2. 插入准备好的数据。
      INSERT INTO test1 VALUES (1,'张三',43,'男') ;
      INSERT INTO test1 VALUES (1,'李四',32,'男') ;
      INSERT INTO test1 VALUES (1,'陈霞',27,'女') ;
      INSERT INTO test1 VALUES (1,'王五',24,'男') ;
      INSERT INTO test1 VALUES (1,'马静',35,'女') ;
      INSERT INTO test1 VALUES (1,'赵倩',22,'女') ;
      INSERT INTO test1 VALUES (1,'周庄',55,'男') ;
    3. 查询表数据。
      select * from test1;
    4. SQL语句编辑完成后,单击工具栏中的运行图标,系统会按照从上往下的顺序执行SQL语句,并打印日志。
      运行
      说明
      • 如果当前工作空间绑定多个MaxCompute计算引擎,请选择需要的MaxCompute引擎实例后,再运行查询语句。
      • 如果您选中的MaxCompute引擎实例使用的是按量计费默认资源组,则可以在运行语句前,单击工具栏中的成本估计图标,预估此次运行产生的费用(实际费用请以账单为准)。
      您在SQL中使用insert into语句有可能造成不可预料的数据重复。虽然已经对insert into语句取消SQL级别的重试,但仍然存在进行任务级别重试的可能性,请尽量避免使用insert into语句。如果使用,运行日志中会出现如下提示。
      在SQL中使用insert into语句有可能造成不可预料的数据重复,尽管对于insert into语句已经取消SQL级别的重试,但仍然存在进行任务级别重试的可能性,请尽量避免对insert into语句的使用! 
      如果继续使用insert into语句,表明您已经明确insert into语句存在的风险,且愿意承担由于使用insert into语句造成的潜在的数据重复后果。
    5. 执行无误后,单击左上角的保存图标,保存当前SQL代码。
    6. 查看执行结果。
      DataWorks的查询结果接入了电子表格功能,方便您对数据结果进行操作。
      查询的结果,会直接以电子表格的形式展示。您可以在DataWorks中执行操作,或者在电子表格中打开,也可以自由复制内容粘贴至本地Excel中。查询结果
      操作 描述
      隐藏列 选中需要隐藏的一列或多列后,单击隐藏列
      复制该行 左侧选中需要复制的一行或多行后,单击复制该行
      复制该列 顶部选中需要复制的一列或多列后,单击复制该列
      复制选中 选中需要复制的内容后,单击复制选中
      数据分析 单击数据分析,即可跳转至数据分析页面。
      搜索 单击搜索后,在查询结果的右上角会出现搜索框,方便对表中的数据进行搜素。
      下载 支持下载GBKUTF-8两种格式。
  6. 单击节点编辑区域右侧的调度配置,配置节点的调度属性。详情请参见基础属性
  7. 提交节点。
    注意 您需要设置节点的重跑属性依赖的上游节点,才可以提交节点。
    1. 单击工具栏中的提交图标。
    2. 提交新版本对话框中,输入备注并选中我确认继续执行提交操作
      如果出现输入输出和代码血缘分析不匹配的告警,请确认是否忽略该告警,或是否需要调整依赖关系。详情请参见调度依赖逻辑说明
    3. 单击确认
    如果您使用的是标准模式的工作空间,提交成功后,请单击右上角的发布。具体操作请参见发布任务
  8. 测试节点,详情请参见周期任务