精华内容
下载资源
问答
  • maxcompute

    2020-01-09 10:31:00
    1.大数据计算服务(Maxcompute,原名ODPS) MaxCompute is a big data processing platform developed by Alibaba Cloud independently. It is a fast and cloud-based big data solution that supports multiple ...

    1.大数据计算服务(Maxcompute,原名ODPS)  

    MaxCompute is a big data processing platform developed by Alibaba Cloud independently. It is a fast and cloud-based big data solution that supports multiple distributed data storage and processing models, which can provide massive data warehouse and big data modeling service.

    MaxCompute Studio is a plugin for IntelliJ platform allowing data developers works with MaxCompute platform including authoring SQL scripts, UDF extensions, MapReduce programs and other functions like local debugging, data browsing and uploading/downloading, job browsing and analytics, etc.
    Features include:
    MaxCompute SQL language support
    MaxCompute function development
    MaxCompute data management
    MaxCompute job management

    分布式的计算模型对数据分析人员要求较高且不易维护。数据分析人员不仅需要了解业务需求,同时还需要熟悉底层分布式计算模型。MaxCompute为您提供完善的数据导入方案以及多种经典的分布式计算模型,您可以不必关心分布式计算和维护细节,便可轻松完成大数据分析。

    DataWorks和MaxCompute关系紧密:DataWorks为MaxCompute提供一站式的数据同步、业务流程设计、数据开发、管理和运维功能。

    产品优势

    • 大规模计算存储

      MaxCompute适用于100GB以上规模的存储及计算需求,最大可达EB级别。

    • 多种计算模型

      MaxCompute支持SQL、MapReduce、UDF(Java/Python)、Graph、基于DAG的处理、交互式、内存计算、机器学习等计算类型及MPI迭代类算法。简化了企业大数据平台的应用架构。

    • 强数据安全

      MaxCompute已稳定支撑阿里全部数据仓库业务9年以上,提供多层沙箱防护、细粒度权限管理及监控。

    • 低成本

      与企业自建专有云相比,MaxCompute的计算存储更高效,可以降低30%~50%的采购成本。

    • 免运维

      基于MaxCompute的Serverless无服务器的设计思路,用户只需关心作业和数据,而无需关心底层分布式架构及运维。

    • 极致弹性扩展

      MaxCompute提供按量付费模式下的作业级别的资源管理。用户无需受困于资源扩展难题,系统会自动扩展计算、存储、网络等资源,最大程度地节省成本。

    maxcompute系统架构

    功能: 

    数据通道

    • 批量历史数据通道

      TUNNEL是MaxCompute为您提供的数据传输服务,提供高并发的离线数据上传下载服务。支持每天TB/PB级别的数据导入导出,特别适合于全量数据或历史数据的批量导入。Tunnel为您提供Java编程接口,并且在MaxCompute的客户端工具中,提供对应的命令实现本地文件与服务数据的互通。

    • 实时增量数据通道

      针对实时数据上传的场景,MaxCompute提供了延迟低、使用方便的DataHub服务,特别适用于增量数据的导入。DataHub还支持多种数据传输插件,例如Logstash、Flume、Fluentd、Sqoop等,同时支持日志服务Log Service中的投递日志到MaxCompute,进而使用DataWorks进行日志分析和挖掘。

    • 计算及分析任务
      MaxCompute支持多种计算模型,详情如下:
      • SQL:MaxCompute以表的形式存储数据,支持多种数据类型,并对外提供SQL查询功能。您可以将MaxCompute作为传统的数据库软件操作,但其却能处理TB、PB级别的海量数据。
         
        说明
        • MaxCompute SQL不支持事务、索引,也不支持Update或Delete操作。
        • MaxCompute的SQL语法与Oracle、MySQL有一定差别,您无法将其他数据库中的SQL语句无缝迁移至MaxCompute中。详情请参见与其他SQL语法的差异
        • MaxCompute主要用于100GB以上规模的数据计算,因此MaxCompute SQL最快支持在分钟或秒钟级别完成查询返回结果,但无法在毫秒级别返回结果。
        • MaxCompute SQL的优点是学习成本低,您不需要了解复杂的分布式计算概念。如果您具备数据库操作经验,便可快速熟悉MaxCompute SQL的使用。
      • UDF:即用户自定义函数。

        MaxCompute提供了很多内建函数来满足您的计算需求,同时您还可以通过创建自定义函数来满足不同的计算需求。

      • MapReduce:MaxCompute MapReduce是MaxCompute提供的Java MapReduce编程模型,它可以简化开发流程,更为高效。您若使用MaxCompute MapReduce,需要对分布式计算概念有基本了解,并有相对应的编程经验。MaxCompute MapReduce为您提供Java编程接口。
      • Graph:MaxCompute提供的Graph功能是一套面向迭代的图计算处理框架。图计算作业使用图进行建模,图由点 (Vertex)和边(Edge)组成,点和边包含权值(Value)。通过迭代对图进行编辑、演化,最终求解出结果,典型应用:PageRank单源最短距离算法 、K-均值聚类算法等。
    • SDK

      SDK是MaxCompute提供给开发者的工具包,当前支持Java SDKPython SDK

    • 安全

      MaxCompute提供了功能强大的安全服务,为您的数据安全提供保护,详情请参见安全指南

    参考资料:1.https://help.aliyun.com/document_detail/27800.html?spm=a2c4g.11186623.6.547.3ec77a55TkBUgk

     

    MaxCompute与DataWorks

    DataWorks是基于MaxCompute计算和存储,提供工作流可视化开发、调度运维托管的一站式海量数据离线加工分析平台。在数加(一站式大数据平台)中,DataWorks控制台即为MaxCompute控制台。

    MaxCompute和DataWorks一起向用户提供完善的ETL和数仓管理能力,以及SQL、MR、Graph等多种经典的分布式计算模型,能够更快速地解决用户海量数据计算问题,有效降低企业成本,保障数据安全。更多使用说明请参见DataWorks什么是DataWorks

    说明 您可以将DataWorks理解成MaxCompute的一种Web客户端。MaxCompute是DataWorks的一种计算引擎。

    MaxCompute与数据集成

    MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库。

    数据集成功能已经集成到DataWorks作为数据同步任务进行配置、运行。您可直接在DataWorks上配置MaxCompute数据源,再配置读取MaxCompute表或者写入MaxCompute表任务,数据的导入和导出整个过程只需在一个平台上进行操作。

    MaxCompute与机器学习PAI

    机器学习PAI是基于MaxCompute的一款机器学习算法平台。它实现了数据无需搬迁,便可进行从数据处理、模型训练、服务部署到预测的一站式机器学习。创建MaxCompute项目,开通机器学习,即可通过机器学习平台的算法组件对MaxCompute数据进行模型训练等操作。详情请参见机器学习PAI操作文档

    MaxCompute与QuickBI

    数据在MaxCompute进行加工处理后,将Project添加为QuickBI数据源,即可在QuickBI页面对MaxCompute表数据进行报表制作,实现数据可视化分析。

    MaxCompute与AnalyticDB for MySQL

    AnalyticDB for MySQL是海量数据实时高并发在线分析(Realtime OLAP)的云计算服务,与MaxCompute结合实现大数据驱动业务系统的场景。通过MaxCompute离线计算挖掘,产出高质量数据后,导入分析型数据库,供业务系统调用分析。

    将MaxCompute数据导入到AnalyticDB for MySQL,有以下两种方式:

    ......

     

    MaxCompute的表格有两种类型:内部表和外部表(MaxCompute2.0版本开始支持外部表)。

    • 对于内部表,所有的数据都被存储在MaxCompute中,表中列的数据类型可以是MaxCompute支持的任意一种数据类型
    • 对于外部表,MaxCompute并不真正持有数据,表格的数据可以存放在OSSOTS中 。MaxCompute仅会记录表格的Meta信息,您可以通过MaxCompute的外部表机制处理OSS或OTS上的非结构化数据,例如视频、音频、基因、气象、地理信息等。

    分区表是指在创建表时指定分区空间,即指定表内的一个或者某几个字段作为分区列。分区表实际就是对应分布式文件系统上的独立的文件夹,该文件夹下是该分区所有数据文件。而分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。分类的标准就是分区字段,可以是一个,也可以是多个。

     

    分区表的意义在于优化查询。查询表时通过WHERE子句查询指定所需查询的分区,避免全表扫描,提高处理效率,降低计算费用。

    参考资料:1.https://help.aliyun.com/document_detail/27820.html?spm=a2c4g.11186623.6.554.165939a4ucghb8

    --创建一个二级分区表,以日期为一级分区,地域为二级分区
    CREATE TABLE src (key string, value bigint) PARTITIONED BY (pt string,region string);

    --正确使用方式。MaxCompute在生成查询计划时只会将'20170601'分区下region为'hangzhou'二级分区的数据纳入输入中。
    select * from src where pt='20170601'and region='hangzhou'; 
    --错误的使用方式。在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是STRING类型,当STRING类型与BIGINT(20170601)比较时,MaxCompute会将二者转换为DOUBEL类型,此时有可能会有精度损失。
    select * from src where pt = 20170601; 


    MaxCompute表的生命周期(Lifecycle),指表(分区)数据从最后一次更新的时间算起,在经过指定的时间后没有变动,则此表(分区)将被MaxCompute自动回收。这个指定的时间就是生命周期。
    • 生命周期单位:Days(天),只接受正整数。
    • 对于非分区表,如果表数据在生命周期Days天内没有被修改,经过Days天后此表将会被MaxCompute自动回收(类似DROP TABLE操作)。生命周期从最后一次表数据被修改的时间(LastDataModifiedTime)起开始计算。
    • 对于分区表,每个分区可以分别被回收。在生命周期Days天内数据未被修改的分区,经过指定的天数后此分区将会被回收,否则会被保留。每个分区的生命周期是从最后一次分区数据被修改的时间LastDataModifiedTime起开始计算。不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。
    • 生命周期只能设定到表级别,不能在分区级设置生命周期。创建表时即可指定生命周期。
    • 如果您没有为表指定生命周期,则表(分区)不会根据生命周期规则被MaxCompute自动回收。

    资源类型

    MaxCompute支持上传的单个资源大小上限为500MB,资源包括以下几种类型:
    • File类型。
    • Table类型:MaxCompute中的表。
       
      说明 MapReduce引用的table类型资源中,table字段类型目前只支持BIGINT、DOUBLE、STRING、DATETIME、BOOLEAN,其他类型暂未支持。
    • Jar类型:编译好的Java Jar包。
    • Archive类型:通过资源名称中的后缀识别压缩类型,支持的压缩文件类型包括.zip/.tgz/.tar.gz/.tar/jar。

     

    展开全文
  • MaxCompute

    2020-12-02 10:51:34
    1.下载MaxCompute客户端工具 1.下载客户端 http://repo.aliyun.com/download/odpscmd/0.29.2/odpscmd_public.zip 2.配置和使用 1).解压缩后,odpscmd 会在用户目录下新建一个名字叫odpscmd 的目录,其中保存了 ...

    WordCount示例

    1.下载MaxCompute客户端工具

    1.下载客户端

    http://repo.aliyun.com/download/odpscmd/0.29.2/odpscmd_public.zip

    2.配置和使用

    1).解压缩后,odpscmd 会在用户目录下新建一个名字叫odpscmd 的目录,其中保存了 odpscmd 的配置文件 ~/.odpscmd/odps_config.ini,打开它将看到:

    project_name=dataworks_workshop_01
    
    access_id=<accessid>
    
    access_key=<accesskey>
    
    end_point=http://service.odps.aliyun.com/api
    
    tunnel_endpoint=http://dt.odps.aliyun.com
    
    log_view_host=http://logview.odps.aliyun.com
    
    https_check=true

    2).在其中填入登录所需要的信息(包括项目名、accessId/Key),保存并退出。

    3).在命令行中输入 odpscmd ,回车,将看到这样的提示:

    > odpscmd
    
    Aliyun ODPS Command Line Tool
    
    Version 0.29.1
    
    @Copyright 2015 Alibaba Cloud Computing Co., Ltd. All rights reserved.
    
    odps@ proj_name>

    4.其中 proj_name 代表你所在的项目名。输入 list tables 可以列出项目下的所有表名。

    odps@ proj_name>list tables;
    
    this_is_a_user_name:this_is_a_table_name
    
    ...

    2.数据环境准备

    进行odpscmd客户端进行如下操作。

    1.创建输入和输出表

    create table wc_in_23 (key string, value string);
    
    create table wc_out_23 (key string, cnt bigint);

    2. 添加测试资源

    ----需要替换本机jar包所在的绝对路径

    add jar  /Work/Testing/odpscmd_public/lib/mapreduce-examples.jar -f;

    3. 使用insert into 插入测试数据

    insert into table wc_in_23 select '238',' val_238' ;
    
    或者
    
    insert into wc_in_23 values('hello','maxcompute');

    备注,也可以通过tunnel、数据集成等方式从本地或数据库、OSS上导入数据到输入表.

    tunnel upload data wc_in;

    3.执行测试步骤

    在 odpscmd 中执行 WordCount,如下所示:

    jar -resources mapreduce-examples.jar com.aliyun.odps.mapred.open.example.WordCount wc_in_23 wc_out_23;

    预期结果:

    作业成功结束后,输出表 wc_out 中的内容,如下所示:

    1. +------------+------------+

    2. | key        | cnt        |

    3. +------------+------------+

    4. | hello      | 1          |

    5. | odps       | 1          |

    6. +------------+------------+

    4.代码示例

        package com.aliyun.odps.mapred.open.example;
    
        import java.io.IOException;
    
        import java.util.Iterator;
    
        import com.aliyun.odps.data.Record;
    
        import com.aliyun.odps.data.TableInfo;
    
        import com.aliyun.odps.mapred.JobClient;
    
        import com.aliyun.odps.mapred.MapperBase;
    
        import com.aliyun.odps.mapred.ReducerBase;
    
        import com.aliyun.odps.mapred.TaskContext;
    
        import com.aliyun.odps.mapred.conf.JobConf;
    
        import com.aliyun.odps.mapred.utils.InputUtils;
    
        import com.aliyun.odps.mapred.utils.OutputUtils;
    
        import com.aliyun.odps.mapred.utils.SchemaUtils;
    
        public class WordCount {
    
          public static class TokenizerMapper extends MapperBase {
    
            private Record word;
    
            private Record one;
    
            @Override
    
            public void setup(TaskContext context) throws IOException {
    
              word = context.createMapOutputKeyRecord();
    
              one = context.createMapOutputValueRecord();
    
              one.set(new Object[] { 1L });
    
              System.out.println("TaskID:" + context.getTaskID().toString());
    
            }
    
            @Override
    
            public void map(long recordNum, Record record, TaskContext context)
    
                throws IOException {
    
              for (int i = 0; i < record.getColumnCount(); i++) {
    
                word.set(new Object[] { record.get(i).toString() });
    
                context.write(word, one);
    
              }
    
            }
    
          }
    
          /**
    
           * A combiner class that combines map output by sum them.
    
           **/
    
          public static class SumCombiner extends ReducerBase {
    
            private Record count;
    
            @Override
    
            public void setup(TaskContext context) throws IOException {
    
              count = context.createMapOutputValueRecord();
    
            }
    
            @Override
    
            public void reduce(Record key, Iterator<Record> values, TaskContext context)
    
                throws IOException {
    
              long c = 0;
    
              while (values.hasNext()) {
    
                Record val = values.next();
    
                c += (Long) val.get(0);
    
              }
    
              count.set(0, c);
    
              context.write(key, count);
    
            }
    
          }
    
          /**
    
           * A reducer class that just emits the sum of the input values.
    
           **/
    
          public static class SumReducer extends ReducerBase {
    
            private Record result = null;
    
            @Override
    
            public void setup(TaskContext context) throws IOException {
    
              result = context.createOutputRecord();
    
            }
    
            @Override
    
            public void reduce(Record key, Iterator<Record> values, TaskContext context)
    
                throws IOException {
    
              long count = 0;
    
              while (values.hasNext()) {
    
                Record val = values.next();
    
                count += (Long) val.get(0);
    
              }
    
              result.set(0, key.get(0));
    
              result.set(1, count);
    
              context.write(result);
    
            }
    
          }
    
          public static void main(String[] args) throws Exception {
    
            if (args.length != 2) {
    
              System.err.println("Usage: WordCount <in_table> <out_table>");
    
              System.exit(2);
    
            }
    
            JobConf job = new JobConf();
    
            job.setMapperClass(TokenizerMapper.class);
    
            job.setCombinerClass(SumCombiner.class);
    
            job.setReducerClass(SumReducer.class);
    
            job.setMapOutputKeySchema(SchemaUtils.fromString("word:string"));
    
            job.setMapOutputValueSchema(SchemaUtils.fromString("count:bigint"));
    
            InputUtils.addTable(TableInfo.builder().tableName(args[0]).build(), job);
    
            OutputUtils.addTable(TableInfo.builder().tableName(args[1]).build(), job);
    
            JobClient.runJob(job);
    
          }
    
        }

     

    展开全文
  • MaxCompute作业日常监控与运维实践

    万次阅读 2021-03-23 13:57:41
    简介: MaxCompute作业日常监控与运维实践 监控项目作业超时运行 案例一 专用于业务团队取数的project_A ,基本都是手动跑SQL查询,每个作业执行基本不会很长时间,由于目前使用的是包年包月计算资源,为了防止...

    简介: MaxCompute作业日常监控与运维实践

    监控项目作业超时运行

    案例一

    专用于业务团队取数的project_A ,基本都是手动跑SQL查询,每个作业执行基本不会很长时间,由于目前使用的是包年包月计算资源,为了防止单个作业长期占用资源,需要对作业进行超时监控。假设对于project_A的SQL作业,只要某个作业运行时长(等待时间+真正运行时间)超过15分钟,则视为异常用时作业,需介入检查。

     

    • 监控配置

    1. 登录[云监控控制台](https://cloudmonitor.console.aliyun.com/)。

    2. 在左侧导航栏,单击报警服务 > 报警规则。

    3. 在报警规则页面的阈值报警页签,单击创建报警规则。

    4. 单击创建报警规则。

    5. 在创建报警规则页面,基于场景配置报警规则相关信息,详细参数配置请参见[创建阈值报警规则](https://help.aliyun.com/document_detail/103072.html)。配置报警联系人详情请参见[创建报警联系人或报警联系组](https://help.aliyun.com/document_detail/104004.html)。

     image.png

    • 资源范围:选择项目名称,并在下方"项目名称"中指定需要监控的项目project_A 。
    • 规则描述:即选择监控指标,如此案例我们针对项目下所有作业 监控,则选择作业运行时长类型。最大值大于等于15*60=900秒,即配置作业运行时长超过15分钟则触发告警,注意单位为'秒'。
    • 通知方式:可以选择短信+邮件+钉钉机器人 (Warning),以便快速从各个通道获取告警,另外告警接收人要注意一定要配置好具体人员,避免接收的人员不是负责此业务的人员。

     

    • 告警处理
      • 收到单个job的超时告警,考虑是否单个作业本身问题,可以通过[MaxCompute管家的作业运维管理](https://help.aliyun.com/document_detail/198711.html?spm=a2c4g.11186623.6.1026.25656a2coeGp9Z)-高级查询单独搜索这个instance id:

         image.png

    在结果列表里,可以看到作业的基本信息,可以点击'Logview'查看详情,如是否是长尾、是否是作业查询量本身就非常大等,经过判断后,可以考虑是否让job继续运行,若不能继续运行则kill掉。若一直是等待资源状态,那么可以到“作业快照”中查看当前时刻,对应资源组的作业负载情况,是否是有其他项目作业占满长期占满资源等。

     

      • 收到多个job超时告警,或者持续单个不同的job超时告警,可以考虑是否是资源不足,大量作业在等待资源,可以在MaxCompute管家作业快照里查看对应资源组此刻正在运行作业负载情况,人工介入,该kill作业的kull作业,该扩容的扩容等。

    案例二

    生产项目project_B ,有跑MaxCompute的SQL、spark等类型任务,所有生产任务都比较重要,正常情况下再大的任务执行时间(等待时间+真正运行时间)不会超过1个小时,考虑到spark有流式作业存在,一个job拉起会很长时间也是正常现象,因此对于本生产项目,可以对SQL类型作业进行监控超时情况,以便尽快介入检查。

    • 监控配置

    1. 登录[云监控控制台](https://cloudmonitor.console.aliyun.com/)。

    2. 在左侧导航栏,单击报警服务 > 报警规则。

    3. 在报警规则页面的阈值报警页签,单击创建报警规则。

    4. 单击创建报警规则。

    5. 在创建报警规则页面,基于场景配置报警规则相关信息,详细参数配置请参见[创建阈值报警规则](https://help.aliyun.com/document_detail/103072.html)。配置报警联系人详情请参见[创建报警联系人或报警联系组](https://help.aliyun.com/document_detail/104004.html)。

    image.png

    • 资源范围:选择项目名称,并在下方"项目名称"中指定需要监控的项目project_B 。
    • 规则描述:即选择监控指标,如此案例我们针对项目下所有作业 监控,则选择作业运行时长类型。最大值大于等于60*60=3600秒,即配置作业运行时长超过1个小时则触发告警,注意单位为'秒'。
    • 通知方式:可以选择短信+邮件+钉钉机器人 (Warning),以便快速从各个通道获取告警,另外告警接收人要注意一定要配置好具体人员,避免接收的人员不是负责此业务的人员。

     

    • 告警处理
    • 收到告警后,您可以通过[MaxCompute管家的作业运维管理](https://help.aliyun.com/document_detail/198711.html?spm=a2c4g.11186623.6.1026.25656a2coeGp9Z)-高级查询单独搜索对应的job,在结果列表中可先判断是否还是等待资源状态,若是,则可以通过作业快照查看此刻对应资源组作业运行情况是否资源紧张;若不是,可以点击Logview查看详细信息,是否长尾等。判断作业的合理性,决定是否继续运行或者kill掉。

     

    若您是通过DataWorks使用MaxCompute,也可以通过DataWorks的[智能监控](https://help.aliyun.com/document_detail/138162.html?spm=a2c4g.11186623.6.1074.f4352d21zjMF73)配置自定义监控规则进行作业超时监控。DataWorks上还可以针对具体调度节点进行监控,监控的指标也更加丰富。

     

    需要注意的是,如果作业一直为运行状态,触发告警的job如果一直处在running状态,那么只要满足告警周期规则,会持续发出告警,直到job运行完成(成功或失败)。如果遇到需要放行继续运行的job,告警周期又短,可能会频繁收到告警,因此在配置规则时告警周期需要合理配置。

     

    查看某时段发起的作业执行情况

    日常数据开发过程中,需要对自己负责的作业进行运维管理,如查看当天发起的作业执行情况,有哪些作业失败要查看失败原因等。

    通过[MaxCompute管家的作业运维管理](https://help.aliyun.com/document_detail/198711.html?spm=a2c4g.11186623.6.1026.25656a2coeGp9Z),可以查看,如下图:

    image.png

    选择需要查看具体发起作业的时间段,选择状态,cancelled即为失败状态,点开高级查询,输入提交人(目前只支持精准匹配,需要带上`ALIYUN$`或`RAM$`前缀),进行搜索。在结果列表里可以快速获取一些基础信息,但是要查看具体失败原因,还需要点击Logview,通过Logview日志查看详情,包括查看对应跑的什么脚本、返回的失败信息等。

     

    需要注意的是,如果是通过DataWorks发起的作业,且项目的“MaxCompute访问者身份”选择的是阿里云主账号的话,那么项目的所有提交人都会是主账号,因此就不适合通过“提交人”进行过滤,只能按其他粒度进行过滤。

     

    查看某时刻包年包月资源组作业负载

    作业资源运维人员,管理计算资源的分配,如收到开发人员反馈当前大量作业等待资源,通过MaxCompute管家概览页的“CU资源使用趋势”查看对应资源组的负载线图,点击具体时间点查看对应时刻作业快照:

    image.png

    • 如果对应资源组是完全独享型(所有自定义配额组预留CU都是最大值=最小值),选择具体的资源组进行查看,这样更有针对性。点击曲线图上对应时刻,进入此刻的作业快照列表,查看当前运行的作业资源占用情况。在结果列表中,再对CUP使用占比进行从高到低排序,看是否是某个或某几个作业长时间占用大量资源,针对性对这些作业进行处理。
    • 如果资源组是共享型(自定义配额组预留CU最大值>最小值),那么可以直接默认查看所有资源组的CU资源使用趋势,这样进入快照列表中看所有资源的作业列表,对CUP使用占比进行从高到低排序,可以看到具体哪些作业在哪个资源组抢占了大量资源,进而针对性的处理作业,或者调整资源组,比如业务优先级低的项目所在资源组最大值可以分配小一些,以免抢占高优先级项目所属资源组的资源。

     

    针对资源组的分配,可以参考[包年包月资源隔离](https://help.aliyun.com/document_detail/197810.html?spm=a2c4g.11186623.6.1153.11fe32c0myBda4)、[包年包月资源分时配额](https://help.aliyun.com/document_detail/194065.html?spm=a2c4g.11186623.6.1152.542b274biJDwSm)。

     

    查看某作业执行相关信息

    在做费用审计、资源审计等,获取到了某个job的instance id,需要找到提交人或者查看具体是执行了什么脚本等。

     

    案例:如使用按量计费资源,对SQL进行费用审计,发现有某个或某几个作业费用异常,需要知道是谁执行的,执行的sql是什么。

    1. 通过[MaxCompute管家的作业运维管理](https://help.aliyun.com/document_detail/198711.html?spm=a2c4g.11186623.6.1026.25656a2coeGp9Z)-高级查询单独搜索对应的job,因为是SQL消费审计,作业一定是成功状态,所以选择terminated状态。

    2. 在结果列表中,查看信息:

    •  若提交人为子账号,则可直接找对应子账号负责人进行自检。
    • 若提交人为主账号且有DataWorks节点ID非空,则大概可以判断是通过DataWorks调度发起的生产节点,可以到DataWorks 运维中心[查看周期任务](https://help.aliyun.com/document_detail/137787.html?spm=a2c4g.11174283.6.1064.1be52b65CcPWWn)搜索节点,找到对应“责任人”,让责任人自检。
    • 若提交人为主账号,且DataWorks节点ID为空,此类比较难以判断责任人,可以通过点击查看Logview,获取具体的query,线下寻找跑过此query的提交人。需要注意的是,Logview一般保留时长为7天,超过7天,可以尝试通过[information schema->TASKS_HISTORY](https://help.aliyun.com/document_detail/135433.html?spm=a2c4g.11186623.6.1032.7ea65856ZU3E4x#title-r2c-tak-zfi)获取作业信息。
    • 若作业是最近7天运行的,作业责任人自检时,也可以直接在结果列表里访问Logview进行查看。

    原文链接

    本文为阿里云原创内容,未经允许不得转载。

    展开全文
  • maxcompute 快速入门

    2019-01-31 09:12:08
    maxcompute 快速入门,最全文档,0基础入门maxcompute开发
  • MaxCompute用户指南

    2018-04-29 19:36:35
    MaxCompute用户指南,阿里MaxCompute(原ODPS)用户指南
  • MaxCompute SQL

    2020-09-13 09:57:23
    MaxCompute SQL 一、概述 1.1 定义 ​ MaxCompute(原 ODPS) SQL 适用于海量数据(TB 级别),实时性要求不高的场合,比如离线批量计算,它的每个作业的准备,提交等阶段要花费较长时间。 ​ 采用的是类似与SQL的...

    MaxCompute SQL

    • 知识点结构图
      在这里插入图片描述

    • 本文初衷是为了学习归纳,若有错误,请指出。

    修改记录

    时间 内容
    2020年9月13日 第一次发布

    一、概述

    1.1 定义

    ​ MaxCompute(原 ODPS) SQL 适用于海量数据(TB 级别),实时性要求不高的场合,比如离线批量计算,它的每个作业的准备,提交等阶段要花费较长时间。

    ​ 采用的是类似与SQL的语法,可以看作是标准SQL的子集,但和数据库也有很多不同,比如没有事务,主键约束,索引等。

    1.2 优缺点

    • 优点:
      • MaxCompute SQL的优点是学习成本低,不需要了解复杂的分布式计算概念,只需要会sql便可以操作;
      • MaxCompute主要用于大规模的数据计算,最快支持在分钟或秒钟级别完成查询返回结果,但无法在毫秒级别返回结果。
    • 缺点:
      • 一次作业批量处理海量数据,不适合直接对接需要每秒处理几千至数万笔事务的业务系统。
      • MaxCompute的SQL语法与Oracle、MySQL有一定差别,无法将其他数据库中的SQL语句无缝迁移至MaxCompute中。
      • MaxCompute SQL不支持事务、索引,也不支持Update或Delete操作

    1.3 支持的数据类型

    ​ 支持的数据类型有:Bigint、Double、String、Datetime、Boolean、Decimal,Float。

    ​ 目前MaxCompute SQL中使用到新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP、BINARY)时,需要用set命令开启:

    • Session级别:要使用新数据类型,需在SQL语句前加上set语句set odps.sql.type.system.odps2=true;,并与SQL语句一起提交执行。

    • Project级别:支持对Project级别进行新类型打开。Project Owner可根据需要对Project进行设置,命令为:

      set odps.sql.type.system.odps2=true;
      CREATE TABLE test_newtype (
          c1 tinyint
          ,c2 smallint
          ,c3 int
          ,c4 BIGINT
          ,c5 float
          ,c6 DOUBLE
          ,c7 decimal
          ,c8 binary
          ,c9 timestamp
          ,c10 ARRAY<map<BIGINT,BIGINT>>
          ,c11 map<STRING,ARRAY<BIGINT>>
          ,c12 STRUCT<s1:STRING,s2:BIGINT>
          ,c13 varchar(20))
      LIFECYCLE 1
      ;
      

    1.4 运算符

    • 关系运算符注意点:

      • 在进行部分关系运算之前,需要首先进行类型转换,否则可能返回NULL。如下举例,'2019-02-16 00:00:01'为DATETIME类型,而'2019-02-16'为STRING类型,在进行比较关系运算前需首先完成显示类型转换:

        select cast('2019-02-16 00:00:01' AS string) > '2019-02-16';
        select cast('2019-02-16 00:00:02' AS datetime) > '2019-02-16 00:00:01';
        
      • 由于DOUBLE值存在一定的精度差,因此建议两个DOUBLE类型相减,取绝对值的方式进行判断。当绝对值足够小时,认为两个DOUBLE数值相等,比如:

      abs(0.9999999999 - 1.0000000000) < 0.000000001
       -- 0.9999999999和1.0000000000为10位精度,而0.000000001为9位精度。
       -- 此时可以认为0.9999999999和1.0000000000相等。
      
      • 在将String类型和Bigint类型数据进行比较时,这两个数据都将转换成Double类型,比较过程中可能丢失精度,所以需要将String用cast显示转换成Bigint类型运算。
    • 算术运算符注意点:

      • A/B中,如果A、B都是Bigint类型,那么结果会是Double类型。
      • 只有参数是STRING、BIGINT或DOUBLE类型才能参与算术运算,日期型和布尔型不允许参与运算。
      • STRING类型在参与运算前会进行隐式类型转换,转换为DOUBLE类型。
    • 位运算符注意点

      • 位运算符不支持隐式转换,只允许BIGINT类型。
    • 逻辑运算符注意点:

      • 逻辑运算符只允许BOOLEAN类型参与运算,不支持隐式类型转换。
      • Null And False = False,Null and True = Null;True or Nnll=True,False or Null = Null;

    1.5 MaxCompute的ACID特性

    • 原子性(Atomicity)
      • 任何时候MaxCompute会保证在冲突时只会一个作业成功,其它冲突作业失败。
      • 对于单个表或分区的CREATE、OVERWRITE、DROP操作,可以保证其原子性。
      • 跨表操作时不支持原子性(例如MULTI-INSERT)。
      • 在极端情况下,以下操作可能不保证原子性:
        • DYNAMIC INSERT OVERWRITE多于一万个分区,不支持原子性。
        • INTO类操作:这类操作失败的原因是事务回滚时数据清理失败,但不会造成原始数据丢失。
    • 一致性(Consistency)
      • OVERWRITE类作业可保证一致性。
      • INTO类作业在冲突失败后可能存在失败作业的数据残留。
    • 隔离性(Isolation)
      • 非INTO类操作保证读已提交。
      • INTO类操作存在读未提交的场景。
    • 持久性(Durability)
      • MaxCompute保证数据的持久性。

    二、类型转换

    ​ MaxCompute SQL允许数据类型之间的转换,类型转换方式包括显式类型转换隐式类型转换

    2.1 显式转换

    ​ 显式类型转换是通过cast()函数将一种数据类型的值转换为另一种类型的值,在MaxCompute SQL中支持的显式类型转换,如下表所示。

    在这里插入图片描述

    • 注意点:
      • 将DOUBLE类型转为BIGINT类型时,小数部分会被截断,例如cast(1.6 as BIGINT) = 1
      • 同样,满足DOUBLE格式的STRING类型转换为BIGINT时,会先将STRING转换为DOUBLE,再将DOUBLE转换为BIGINT,因此,小数部分会被截断。
      • 满足BIGINT格式的STRING类型可以被转换为DOUBLE类型,小数点后保留一位,例如cast(“1” as DOUBLE) = 1.0
      • 日期类型转换时采用默认格式yyyy-mm-dd hh:mi:ss。
      • MaxCompute支持复杂类型的类型转换功能,规则同上。

    2.2 隐式转换

    ​ 隐式类型转换是指在运行时,由MaxCompute依据上下文使用环境及类型转换规则自动进行的类型转换。MaxCompute支持的隐式类型转换规则,如下表所示。

    在这里插入图片描述

    在这里插入图片描述

    • 注意点:
      • 这里的Y是指两者之间支持隐式转换,而没有说明转换成谁。

    2.2.1 关系运算符作用下的隐式转换

    ​ 关系运算符包括=、<>、<、<=、>、>=、IS NULL、IS NOT NULL、LIKE、RLIKE、IN。由于LIKE、RLIKE、IN的隐式类型转换规则不同于其他关系运算符,将单独对其进行说明。此处的说明不包含这三种特殊的关系运算符。

    ​ 当不同类型的数据共同参与关系运算时,按照下述原则进行隐式类型转换。

    在这里插入图片描述

    • 总结:
      • Bigint、String、Double,三者Double最大,Bigint和String互转也会变成Double。
      • 有Decimal的情况,Decimal最大。

    2.2.2 特殊的关系运算符作用下的隐式转换

    ​ 特殊的关系运算符包括LIKE、RLIKE、IN

    • LIKE和RLIKE的source和pattern参数均仅接受STRING类型。
    • 其他类型不允许参与运算,也不能进行到STRING类型的隐式类型转换。
    • IN右侧的VALUE值列表中的数据类型必须一致。
    • key in (value1, value2, …)中,当KEY与VALUES之间比较时,如果数据类型包含BIGINT、DOUBLE、STRING,建议统一转为DOUBLE类型;如果数据类型包含DATETIME、STRING,建议统一转为DATETIME类型。除此之外不允许其它类型之间的转换。

    2.2.3 算术运算符作用下的隐式转换

    • 只有STRING、BIGINT、DOUBLE和DECIMAL才能参与算术运算。
    • STRING在参与运算前会进行隐式类型转换到DOUBLE。
    • BIGINT和DOUBLE共同参与计算时,会将BIGINT隐式转换为DOUBLE。
    • 日期型和布尔型不允许参与算数运算。

    2.2.4 逻辑运算符作用下的隐式转换

    ​ 只有BOOLEAN才能参与逻辑运算。

    2.3 内建函数涉及到的隐式转换

    ​ 在调用函数时,如果输入参数的数据类型与函数定义的参数数据类型不一致,把输入参数的数据类型转换为函数定义的数据类型。

    2.4 CASE WHEN作用下的隐式转换

    ​ 针对case when中有不同结果类型的情况。

    • 如果返回类型只有BIGINT、DOUBLE,统一转换为DOUBLE。
    • 如果返回类型中有STRING类型,统一转换为STRING,如果不能转换(如BOOLEAN类型)则报错。
    • 除此之外不允许其它类型之间的转换。

    2.5 String和Datetime之间的转换

    ​ 这两者之间转换要遵循下面的格式:

    • 注意

      • 以下将转换失败,没有严格按照格式来。可以先用TO_DATE函数调整格式再转
        cast("2013/12/31 02/34/34" as datetime)  
        cast("20131231023434" as datetime)  
        cast("2013-12-31 2:34:34" as datetime)
      
      • 如果超出对应月份实际拥有的天数,将会导致异常退出。

    三、分区表

    ​ MaxCompute 用户在创建表时,允许指定表的某些列为分区列,从而决定数据的存储流向。指定分区列(在 select 语句的 where 条件过滤中使用分区列作为过滤条件)会给用户带来诸多便利,例如:提高 SQL 运行效率,减少计费等。

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

    ​ 但在使用 输出到动态分区(DYNAMIC PARTITION),SQL 的运行效率较低,并且会带来较高的计费。

    四、SQL操作

    4.1 表操作

    4.1.1 创建表

    ​ 创建表的语法格式,如下所示,但一般有很多用不到,用不到的加“–”号注释了:

    #完整版
    CREATE [EXTERNAL] TABLE IF NOT EXISTS table_name
    [(col_name 数据类型 [DEFAULT value] [COMMENT 字段注释], ...)]
    [COMMENT 表中文注释]
    [PARTITIONED BY (col_name 数据类型 [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]
    
    
    # 第二种建表:
     CREATE TABLE [IF NOT EXISTS] table_name
     LIKE existing_table_name
     
    # 第三种建表
    create table if not exists table_name 
    AS select_statement;
    
    • 注意点:
      • 1.partitioned by的字段必须不是建表里面的字段。
      • 2.不加EXTERNAL代表内部表,加EXTERNAL代表外部表,外部表、内部表和Hive的差不多,如下:
      • 3.partitioned by指定表的分区字段,目前支持TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING类型。
      • 4.LIFECYCLE是表的生命周期,单位:天。注意,create table like语句不会复制源表的生命周期属性。
      • 5.如果是用create table… as select …的方式来建表,那么在建表的同时将数据复制到新表中,但是不会复制分区属性,只会把源表的分区列作为目标表的一般列处理,也就是新表会多一列。
      • 6.如果是用第二种建表create table …like …的方式来建表,那么源表和目标表具有相同的表结构,即列名、列注释以及表注释等均相同(生命周期不会)。但源表中的数据不会被复制到目标表

    hive外部表和内部表的区别:

    • 1.创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;创建外部表时需要加上external关键字,它仅记录数据所在的路径,不对数据的位置做任何改变。
    • 2.删除表时:删除表后,内部表的元数据和真实数据会被一起删除,而外部表仅删除元数据,不删除真实数据,这样外部表相对来说更加安全些,数据组织也比较灵活,方便共享原始数据。(直接重建原来的表后,数据就自动导入到原来的表去了,location直接指向原来存储的位置)
    • 外部表保障底层数据的安全性,内部表适用于管理中间表和结果表。

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

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

    • sorted by用于指定在Bucket内字段的排序方式。建议sorted byclustered 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上传数据是无序的。
    • 案例:

    CREATE TABLE T1 (a string, b string, c bigint) CLUSTERED BY (c) SORTED by (c) INTO 1024 BUCKETS; --创建Hash Clustering非分区表。
    CREATE TABLE T1 (a string, b string, c bigint) PARTITIONED BY (dt string) CLUSTERED BY (c) SORTED by (c) INTO 1024 BUCKETS; --创建Hash Clustering分区表。
    

    4.1.2 表其他操作

    -- 查看表
    DESC <table_name>;
    DESC extended <table_name>; --查看外部表信息。
    
    -- 查看建表语句
    SHOW CREATE TABLE <table_name>;
    
    -- 删除表
    -- 删除外部表时,OSS上的数据不会被删除。跟Hive一样意思。
    DROP TABLE [IF EXISTS] table_name;
    
    -- 重命名表
    ALTER TABLE table_name RENAME TO new_table_name;
    
    -- 修改表Owner
    ALTER TABLE table_name CHANGEOWNER TO 'ALIYUN$xxx@aliyun.com';
    
    -- 修改表的注释
    ALTER TABLE table_name SET COMMENT 'new coments for table sale_detail';
    
    -- 修改表的修改时间
    -- 此时,MaxCompute会认为表的数据有变动,生命周期的计算会重新开始。
    ALTER TABLE table_name TOUCH;
    
    -- 修改表的Hash Clustering属性
    ALTER TABLE table_name     
    [CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]
    -- 去除表的Hash Clustering属性的语法格式如下
    ALTER TABLE table_name NOT CLUSTERED;
    
    -- 清空非分区表里的数据
    TRUNCATE TABLE table_name;
    
    -- 清空分区表里的数据
    ALTER TABLE table_name DROP PARTITION(dt = '??????');
    
    -- 强制删除表数据(分区数据),可以加purge
    DROP TABLE table_name PURGE;
    ALTER TABLE table_name DROP PARTITION(dt = '??????') PURGE;
    
    -- 备份表
    

    4.1.3 备份表的数据

    ​ 如果project 里的空间比较紧张,在想办法进行删除数据或者压缩数据,那么可以考虑 MaxCompute 里对表 的 archive 功能,效果是可以将存储空间压缩 50%左右,而且在这个过程中会将多个小文件自动的合并掉

    ​ 代价是如果某个数据块 损坏或某台机器损坏,恢复数据块的时间要比原来的方式长了,读的性能会有一定损失。

    ​ 所以现在这种功能可以用在一些冷数据的压缩存储上,比如一些非常大的日志数据,超过一定时间期限后使用 的频率非常低,但是又需要长期保存,则可以考虑用 raid file 来存储。

    ​ 语法:

    ALTER TABLE [table_name] <PARTITION(partition_name='partition_value')> ARCHIVE;
    
    -- 案例
    alter table my_log partition(ds='20140101') archive;
    

    4.2 生命周期操作

    ​ MaxCompute提供了数据生命周期管理功能,方便释放存储空间,简化回收数据的流程

    4.2.1 注意事项

    • 在MaxCompute中,每当表的数据被修改后,表的LastDataModifiedTime将会被更新,非分区表和分区表的数据是否要回收都是根据每张表的LastDataModifiedTime和设置的生命周期天数来判断的,从最后一次数据被修改开始计算,如果经过days后仍没有被改动,就会被系统自动回收(类似drop table操作)
    • 不同的是非分区表不支持取消生命周期的设置,只能修改生命周期;而分区表可以取消某个具体分区的生命周期设置,并且就算最后一个分区被回收了,这张分区表也不会被删除
    • 生命周期只能在表级别设置,不能在分区级别设置,但分区表设置生命周期后,生命周期是在分区级别生效。
    • create table …like …的方式来建表,会复制列名、列注释以及表注释等,但生命周期不会

    4.2 2 禁止生命周期

    ​ 在某些情况下有些特定的分区可能不希望被生命周期功能自动回收掉,比如一个月的月初,或者双 11 期间的数 据,在这种情况下可以禁止该分区被生命周期功能回收。

    ​ 语法:

    -- 禁止生命周期
    ALTER TABLE table_name [partition_spec] ENABLE|DISABLE LIFECYCLE;
    
    -- 示例
    ALTER TABLE trans PARTITION(dt='20141111') DISABLE LIFECYCLE;
    

    4.2.3 修改表的生命周期属性

    ​ MaxCompute 提供数据生命周期管理功能,方便用户释放存储空间。

    ​ 语法:

    -- 修改表的生命周期属性
    ALTER TABLE table_name SET LIFECYCLE DAYS;
    
    -- 案例
    ALTER TABLE test_lifecycle SET lifecycle 50;
    
    • 第一种情况,如果表是非分区表,自最后一次数据被修改开始计算,经过 days 天后数据仍未被改动,则此表无需 用户干预, 将会被 MaxCompute 自动回收(类似 drop table 操作)。在 MaxCompute 中,每当表的数据被修改后,表的LastDataModifiedTime 将会被更新,因此, MaxCompute 会根据每张表的LastDataModifiedTime 以及 lifecycle 的设 置来判断是否要回收此表。
    • 第二中情况,如果是分区表,则根据各分区的 LastDataModifiedTime 判断该分区是否该被回收。不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。

    4.3 分区和列操作

    • 注意:
      • MaxCompute SQL仅支持新增分区,不支持新增分区字段;
      • 不能删除列;
      • 添加的新列不支持指定顺序,默认在最后一列。

    4.3.1 分区操作

    -- 添加分区
    -- 对于多级分区的表,如果需要添加新的分区,必须指明全部的分区值。
    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION(par1 = '',par2 = ''...);
    
    -- 删除分区操作
    ALTER TABLE table_name DROP [IF EXISTS] PARTITION(par1 = '',par2 = ''...);
    
    -- 修改分区值
    ALTER TABLE table_name PARTITION (par1 = '旧值',par2 = '旧值', ...) RENAME TO PARTITION (par1 = '新值',par2 = '新值', ...);
    
    -- 修改表、分区的更新时间
    ALTER TABLE table_name TOUCH PARTITION(par1 = '',...);
    

    4.3.2 列操作

    -- 添加列
    ALTER TABLE table_name ADD COLUMNS (col_name1 数据类型,col_name2 数据类型...);
    
    -- 修改列名操作
    ALTER TABLE table_name CHANGE COLUMN old_col_name RENAME TO new_col_name;
    
    -- 修改列的注释
    ALTER TABLE table_name CHANGE COLUMN col_name COMMENT comment_string;
    
    -- 同时修改列名及列注释
    ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name column_type COMMENT column_comment;
    

    4.3.3 合并分区

    ​ MaxCompute SQL提供MERGE PARTITION对分区进行合并,即同一个表下多个分区数据合并成一个分区,同时删除被合并的分区维度的信息,把数据移动到指定分区。

    • 注意:
      • 如果运行过程中出现源数据被并发修改(包括INSERTRENAMEDROP)时,即使指定IF EXISTS也会报错。
      • 不支持外部表和SHARD表,对于CLUSTERED表合并后的分区文件会消除CLUSTERED属性。
      • 一次性合并分区数量限制为4000个。

    ​ 语法:

    ALTER TABLE <tableName> MERGE [IF EXISTS] PARTITION(<predicate>) [, PARTITION(<predicate2>) ...] OVERWRITE PARTITION(<fullPartitionSpec>) [PURGE];
    
    -- 示例:
    +------------+------------+------------+------------+
    | value      | ds         | hh         | mm         |
    +------------+------------+------------+------------+
    | 1          | 20181101   | 00         | 00         |
    | 1          | 20181101   | 00         | 10         |
    | 1          | 20181101   | 10         | 00         |
    | 1          | 20181101   | 10         | 10         |
    +------------+------------+------------+------------+
    -- 合并所有满足hh='00' 的分区到hh='00',mm='00'中。
    ALTER TABLE intpstringstringstring MERGE PARTITION(hh='00') OVERWRITE PARTITION(ds='20181101', hh='00', mm='00');
    -- 合并后:
    ds=20181101/hh=00/mm=00
    ds=20181101/hh=10/mm=00
    ds=20181101/hh=10/mm=10
    
    -- MERGE PARTITIONS允许指定多个谓词条件,示例如下,指定到具体分区下,合并剩余分区。
    ALTER TABLE intpstringstringstring MERGE IF EXISTS 
    PARTITION(ds='20181101', hh='00', mm='00'), partition(ds='20181101', hh='10', mm='00'),  PARTITION(ds='20181101', hh='10', mm='10') 
    OVERWRITE PARTITION(ds='20181101', hh='00', mm='00') PURGE;
    

    4.4 视图操作

    4.4.1 创建视图

    • 注意:
      • 不允许向视图写入数据,例如使用insert into或者insert overwrite操作视图。
      • 创建视图时,您必须有对视图所引用表的读权限。

    ​ 语法:

    CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name
        [(col_name [COMMENT col_comment], ...)]		-- 没有数据类型
        [COMMENT view_comment]
        [AS select_statement]
        
    -- 创建视图sale_detail_view。
    create view if not exists sale_detail_view
    (store_name, customer_id, price, sale_date, region)
    comment 'a view for table sale_detail'
    as select * from sale_detail;
    

    4.4.2 视图其他操作

    -- 重命名视图
    ALTER VIEW view_name RENAME TO new_view_name;
    
    -- 删除视图
    DROP VIEW [IF EXISTS] view_name;
    

    4.5 更新表数据(Insert OverWrite 和 Insert Into)

    • 语法:

      INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [(col1,col2 ...)]
      select_statement
      FROM from_statement;
      
    • 注意

      • MaxCompute的INSERT语法与通常使用的MySQL或Oracle的INSERT语法有差别,在INSERT OVERWRITE/INTO后需要加入TABLE关键字,而非直接使用TABLENAME
      • 当遇到并发写入时,MaxCompute会保证在冲突时只会一个作业成功,其它冲突作业失败。
      • OVERWRITE类作业可保证一致性,但INTO类作业在冲突失败后可能存在失败作业的数据残留。
      • Insert后面的partition参数不允许使用函数等表达式,只能是常量;
      • 源表与目标表的对应关系依赖于在select子句中列的顺序,而不是表与表之间列名的对应关系。
      • 向某个分区插入数据时,分区列只能出现在select的条件中。

    4.5.1 功能说明

    • insert into:直接向表或表的分区中追加数据。不支持INSERT INTO到Hash Clustering表。如果您需要插入少量测试数据,可以配合VALUES使用。
    • insert overwrite:先清空表中的原有数据,再向表或分区中插入数据。目前INSERT OVERWRITE不支持指定插入列的功能,暂时只能用INSERT INTO

    4.5.2 Insert 动态分区注意事项

    • insert into partition时,如果分区不存在,会自动创建分区。
    • 多个insert into partition作业并发时,如果分区不存在,会自动创建分区,但只会成功创建一个分区。(这点和并发写入保证只有一个作业成功一样)
    • 如果不能控制insert into partition作业并发,则只能通过预创建分区避免问题。

    4.6 多路输出-Multi Insert

    ​ MaxCompute SQL支持在一个语句中将数据插入不同的目标表或者分区中实现多路输出。

    ​ 语法:就是一个From开头,后面多个insert语句。

    FROM from_statement
    INSERT OVERWRITE | INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]
    select_statement1 [FROM from_statement]
    [INSERT OVERWRITE | INTO TABLE tablename2 [PARTITION (partcol1=val3, partcol2=val4 ...)]
    select_statement2 [FROM from_statement]]
    
    • 注意:
      • 通常,单个SQL中最多可以写255路输出。超过255路,则报语法错误。
      • 在一个multi insert中,对于分区表,同一个目标分区不允许出现多次。
      • 在一个multi insert中,对于未分区表,该表不能出现多次。
      • 对于同一张分区表的不同分区,不能同时有insert overwriteinsert into操作,否则报错返回
    • 示例:
    --创建表sale_detail_multi。
    create table sale_detail_multi like sale_detail;
    
    --将表sale_detail中的数据插入到表sale_detail_multi。
    set odps.sql.allow.fullscan=true; //开启全表扫描,仅此session有效。
    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' ) 
    select shop_name, customer_id, total_price 
    insert overwrite table sale_detail_multi partition (sale_date='2011', region='china' )
    select shop_name, customer_id, total_price ;
    

    4.7 输出到动态分区

    4.7.1 说明

    ​ 在使用INSERT OVERWRITE语句将数据插入到分区表时,MaxCompute提供了如下两种方式:

    • 输出到静态分区:在INSERT语句中直接指定分区值,将数据插入指定的分区。
    • 输出到动态分区:在INSERT语句中不直接指定分区值,只指定分区列名。分区列的值在SELECT子句中提供,系统自动根据分区字段的值将数据插入到相应分区。(在SQL运行之前,您无法得知会产生哪些分区。只有在语句运行结束后,才能通过分区字段产生的值确定产生的分区)

    4.7.2 动态分区语法

    INSERT OVERWRITE|INTO TABLE tablename PARTITION (partcol1, partcol2 ...) --也就是这里不指定具体值
    select_statement FROM from_statement;
    

    4.7.3 动态分区注意事项

    • 使用INSERT INTO最多可以生成10000个动态分区,使用INSERT OVERWRITE最多可以生成60000个动态分区。
    • 分布式环境下,使用动态分区功能的SQL中,单个进程最多只能输出512个动态分区,否则会引发运行时异常。
    • 动态生成的分区值不允许为NULL,也不支持含特殊字符和中文,否则会引发运行时异常FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx
    • 如果目标表有多级分区,在运行INSERT语句时允许指定部分分区为静态,但是静态分区必须是高级分区。
    • 如果目标表为Hash Clustering Table,则不支持动态分区。
    • 动态分区中,select_statement字段和目标表动态分区的对应是按字段顺序决定,并不是按照列名称决定的。
      • 动态分区插入时, 。这点和普通插入分区表不一样。
    • 在动态分区进行时,如果分区列的数据类型和select列表中类型不一致,MaxCompute能支持隐式类型转换。

    五、SELECT语句

    5.1 Select语法注意事项

    • SELECT语句查询分区表时禁止全表扫描,屏显目前最多只能显示10000行结果。

      • 如果想要执行全表扫描,需要执行以下开关:set odps.sql.allow.fullscan=true;
    • select_expr支持这样的正则表达式:

      SELECT `abc.*` FROM t;选出t表中所有列名以abc开头的列。
      SELECT `(ds)?+.+` FROM t;选出t表中列名不为ds的所有列。
      SELECT `(ds|pt)?+.+` FROM t;选出t表中排除ds和pt两列的其它列。
      SELECT `(d.*)?+.+` FROM t;选出t表中排除列名以d开头的其它列。
      
    • 在SQL解析中,GROUP BY操作先于SELECT操作,因此GROUP BY的取值是SELECT输入表的列名或者由输入表的列构成的表达式,不允许是SELECT语句的输出列的别名。

    • OFFSET 和 ORDER BY LIMIT语句配合,可以指定跳过OFFSET数目的行。

      --将src按照key从小到大排序后,输出第11到第30行(OFFSET 10指定跳过前10行,LIMIT 20指定最多输出20行)。
      SELECT * FROM src ORDER BY key LIMIT 20 OFFSET 10;
      
    • 子查询必须要有别名

    5.2 select语序

    案例一:

    SELECT  key
            ,MAX(value)
    FROM    src t
    WHERE   value > 0
    GROUP BY key
    HAVING  SUM(value) > 100
    ORDER BY key
    LIMIT   100
    ;
    
    -- 以上语句的逻辑执行顺序是FROM->WHERE->GROUY BY->HAVING->SELECT->ORDER BY->LIMIT
    
    -- 案例二
    SELECT  shop_name
            ,total_price
            ,region
    FROM    sale_detail
    WHERE   total_price > 150
    DISTRIBUTE BY region
    SORT BY region
    ;
    
    -- 以上语句的逻辑执行顺序是FROM->WHERE->SELECT->DISTRIBUTE BY->SORT BY。
    
    • ORDER BY中只能引用SELECT列表中生成的列,而非访问FROM的源表中的列。
    • HAVING可以访问GROUP BY key和聚合函数。
    • SELECT时,如果语句中有GROUP BY,便只能访问GROUP BY key和聚合函数,而不是FROM中源表中的列。

    5.3 交集、并集、补集

    交集:Intersect & Intersect distinct(交集后去重)

    并集:Union All & Union

    补集:Except All & Except distinct (即第一个数据集减去第二个数据集的结果,默认是EXCEPT DISTINCT)

    ​ 这里EXCEPT等同于MINUS

    -- EXCEPT ALL 如果第一个数据集有重复的,有多少个减多少个
    SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) 
    EXCEPT ALL 
    SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
    
    -- EXCEPT DISTINCT 如果第一个数据集有重复的,那么只当做去重后的一个来减
    SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) 
    EXCEPT
    SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
    

    ​ 注意,集合操作左右两个分支要求列个数必须一致。如果数据类型不一致,可能会进行隐式类型转换。

    ​ MaxCompute最多允许256个分支的集合操作,超出256个将报错。

    5.4 Join操作

    • LEFT OUTER JOIN:左连接,可简写为LEFT JOIN。返回左表中的所有记录,右表中没有与之匹配的记录显示为空。
      • 如果右表值不唯一,建议不要连续使用过多LEFT JOIN,会造成数据重复,数据膨胀导致作业停止。
    • RIGHT OUTER JOIN:右连接,可简写为RIGHT JOIN。返回右表中的所有记录,左表中没有与之匹配的记录显示为空
    • FULL OUTER JOIN:全连接,可简写为FULL JOIN。返回左右表中的所有记录。
    • INNER JOIN:内连接。关键字INNER可以省略。返回表之间相互都匹配的数据行
    • 隐式连接,即不指定JOIN关键字执行连接。就普通的写法
    • 自然连接,natural join

    5.5 Semi Join

    参考:https://help.aliyun.com/document_detail/73784.html?spm=a2c4g.11186623.6.700.2f0d3dd6JPv77w

    5.6 MapJoin Hint

    ​ 当一个大表和一个或多个小表JOIN时,可以在SELECT语句中显式指定MAPJOIN以提升查询性能。

    5.6.1 原理

    ​ 在大表和一个或多个小表JOIN的场景下,MAPJOIN会将指定的小表全部先加载到的内存中,然后在Map阶段完成大表和小表的连接从而加快JOIN的执行速度

    ​ MAPJOIN在Map阶段执行表连接,而不用等到Reduce阶段才执行表连接。这样就节省了大量数据传输的时间以及系统资源,从而起到了优化作业的作用。

    ​ 指定的表仅能为小表,且表被加载到内存后占用的总内存不得超过512 MB。

    通常情况下,JOIN操作在Reduce阶段执行表连接。整个JOIN过程包含Map、Shuffle和Reduce三个阶段。

    5.6.2 使用方法

    ​ 在SELECT语句中使用Hint提示/*+ MAPJOIN(table) */,如下:

    SELECT /* + MAPJOIN(a) */
            a.shop_name,
            b.customer_id,
            b.total_price
    FROM shop a JOIN sale_detail b
    ON a.shop_name = b.shop_name;
    

    5.6.3 使用(限制)条件

    • MAPJOIN支持小表为子查询,在引用小表或子查询时,需要引用别名。
    • LEFT OUTER JOIN的左表必须是大表,RIGHT OUTER JOIN的右表必须是大表,INNER JOIN的左表或右表均可以作为大表,FULL OUTER JOIN不能使用MAPJOIN。
    • MaxCompute在MAPJOIN中最多支持指定128张小表,否则报语法错误。MAPJOIN中多个小表用逗号隔开,例如/*+MAPJOIN(a,b,c)*/。(实际开发一般是8张)
    • 如果使用MAPJOIN,则小表占用的总内存不得超过512 MB。由于MaxCompute是压缩存储,因此小表在被加载到内存后,数据大小会急剧膨胀。此处的512 MB是指加载到内存后的空间大小。
    SELECT /* + MAPJOIN(a) */
            a.total_price,
            b.total_price
    FROM shop a JOIN sale_detail b
    ON a.total_price < b.total_price OR a.total_price + b.total_price < 500;
    

    5.7 Laterval View

    5.8 Grouping Sets

    -待补充。

    参考:https://help.aliyun.com/document_detail/92807.html?spm=a2c4g.11186623.6.704.625e8030Qazc5p

    5.9 SELECT TRANSFORM语法

    -待补充。

    参考:https://help.aliyun.com/document_detail/73719.html?spm=a2c4g.11186623.6.705.4ba67830goviwc

    5.10 With AS语法(CTE)

    ​ MaxCompute支持SQL标准的CTE,提高SQL语句的可读性与执行效率。

    ​ 语法格式:

    WITH 
         cte_name AS
        (
            cte_query
        )
        [,cte_name2  AS 
         (
         cte_query2
         )
        ,……]
    

    示例:

    -- 这样写看起来复杂
    INSERT OVERWRITE TABLE srcp PARTITION (p='abc')
    SELECT * FROM (
        SELECT a.key, b.value
        FROM (
            SELECT * FROM src WHERE key IS NOT NULL    ) a
        JOIN (
            SELECT * FROM src2 WHERE value > 0    ) b
        ON a.key = b.key
    ) c
    UNION ALL
    SELECT * FROM (
        SELECT a.key, b.value
        FROM (
            SELECT * FROM src WHERE key IS NOT NULL    ) a
        LEFT OUTER JOIN (
            SELECT * FROM src3 WHERE value > 0    ) b
        ON a.key = b.key AND b.key IS NOT NULL
    )d;
    
    -- 可以改成with as的形式比较直观。也不用反复嵌套
    with 
      a as (select * from src where key is not null),
      b as (select  * from src2 where value>0),
      c as (select * from src3 where value>0),
      d as (select a.key,b.value from a join b on a.key=b.key),
      e as (select a.key,c.value from a left outer join c on a.key=c.key and c.key is not null)
    insert overwrite table srcp partition (p='abc')
    select * from d union all select * from e;
    

    5.11 Clone Table 复制表

    -待补充。

    5.12 Explain执行计划

    -待补充。

    六、 MaxCompute和其他数据库的区别

      1. MaxCompute适合海量存储和大数据分析,不适合在线服务;
      1. MaxCompute表不支持主键、索引和字段约束,不支持事务操作。
      1. MaxCompute表不⽀持UPDATE操作和DELECT操作,只能DROP 整个表或者某一分区数据,然后用INSERT OVERWRITE/INSERT INTO写入数据。
      1. MaxCompute可以在select中使用mapjoin Hint,将指定的小表全部先加载到的内存中,然后在Map阶段完成大表和小表的连接从而加快JOIN的执行速度,提高查询速度;
      1. SELECT操作输出屏显的数据行数受限制,最大为10000条。不支持通过SQL下载数据。
      1. MaxCompute表可以指定生命周期,生命周期结束后自动清除数据;
      1. 插入语句有insert into | overwrite into,后面需加Table关键字,overwrite into写入前会清空表数据;
      1. 子查询必须要有别名,select输入表的数量不能超过16张。
      1. 数据插入表的字段映射不是根据Select的别名做的,而是根据Select的字段的顺序和表里的字段的顺序。
      1. 不能修改分区列列名,只能修改分区列对应的值,支持增加列,但是不支持删除列以及修改列的数据类型(数据类型应该可以吧)。
      1. 在MaxCompute中需要通过Tunnel、Dship工具或MaxCompute Tunnel SDK导出数据。
      1. select语句的查询结果默认使用了limit,如果希望数据量很大时返回所有记录,需要设置

    其他区别参考:https://help.aliyun.com/document_detail/51823.html?spm=a2c4g.11186623.2.19.68516f416InQIc#concept-yjp-crl-vdb --SQL使用限制

    七、函数

    7.1 内建函数

    -待补充。

    7.2 自定义函数

    -待补充。

    八、MaxCompute SQL优化

    ​ 首先优化SQL的过程,实际上就是要尽可能减少IO读取,尽可能减少计算资源的使用,尽可能减少SQL复杂度,尽可能提升运行速度。

    • (1) 建分区表:但建议分区层数不超过3层,后续查询时为了避免全表扫描需要分区裁剪,分区值尽量常量化,避免不可确定值;插入数据时尽量采用写入静态分区的方式,优化数据存储,提高运行效率;如果用动态分区,底层来说会生成较多的小文件和多个mapreduce任务,增加系统负担。
    • (2) 只select有效列,并用limit限制返回的条数。考虑这两种情况:(1)有些事实表的字段很多,多到有四五十个字段,这种表实际是可能存在的,比如企业报税的申报表,那么select * from整张表的所有字段时,数据量一大就会消耗更多查询时间;(2)第二种情况是假设事实表中存有某个复杂格式的字段,比如json格式,那么在select * from时也会耗时严重,因此select有效列是较好的习惯。
    • (3) mapjoin优化:mapjoin的原理简单说就是先将小表加载到内存中,后续大表与内存中的小表直接join连接计算(底层是大表与内存中的小表的计算在map阶段直接完成,避免了reduce阶段的计算耗时)
    • (4) 避免一些消耗资源的操作,比如:
      • 少用distinct,容易触发数据倾斜
      • count(distinct)处理的时间会很长可以转换成count()+ group by。因为如果原先只用count(distinct)来处理表的数据,只会开启一个reduce任务来完成所有的计算,而改成count/sum + group by后,除了count/sum会开启一个reduce计算之外,group by也会单独开启另一个reduce来计算,因此数据量大时可以明显提升查询速度。
      • 尽量避免Order by,order by会触发全局排序,只能单点运行,效率低,如果业务允许,可以改成distribute by + sort by
      • 将full outer join 改为left outer join + union all 并对小表使用上mapjoin。
      • 多个表join时,join顺序很重要,优先选择join结果输出小的表先关联,能有效减少中间数据量,节省IO和计算资源。
      • 读取相同源表时可以合并成一条sql,系统会优化只读取一次。
    • (5) 尽量使用内置的UDF函数和窗口函数:内置UDF在实现时做了很多优化,运行快,省资源,窗口函数本身能处理很多复杂问题。
    • (6) 尽可能保证表达式两边的数据类型一致:如果发生隐式转换容易造成精度问题,比如string和bigint都转成double来相等比较,悲观情况下,可能触发数据倾斜。这时要cast显式转换一下
    工作中还用到的:
    - 数据量达到千万级别的,尽量固化分区,不在查询sql里面进行动态分区,减少资源使用
    - sql行数较长的,尽量拆分成工作流任务,可以优化性能和排查问题的难易度。
    - 维度表要放到mapjoin里,加大资源利用率
    - 数据倾斜较高的表,先落地成临时表
    - 每日全量推送任务的,如果表级数据量较高的,分析是否可以改成增量模式。
    

    九、问题案例收集

    ​ 待补充

    参考:https://help.aliyun.com/knowledge_detail/150534.html#section-iok-hsp-b2z

    展开全文
  • 总论: 大数据计算服务 ( MaxCompute,原名 ODPS )是一种快速、完全托管的 TB/PB 级数据仓库解决方案 。...同时,大数据开发套件和 MaxCompute关系紧密,大数据开发套件为 MaxCompute 提供了一站式的数据同...
  • maxcompute troubleshoot

    2020-01-09 17:39:00
    1.maxcompute python 执行时报错 ValueError: level must be >= 0 原因:maxcompute只支持python2.7 好像目前不支持3.X以上
  • 学习MaxCompute

    2020-01-08 18:56:13
    学习MaxCompute什么是MaxCompute购买客户端- DataWorks- 命令行- idea 什么是MaxCompute 托关于阿里云上的EB级数据仓库类似于hive,不需要自己运维。使用它只需要一个谷歌浏览器访问阿里云,可以在浏览器的界面写sql...
  • MaxCompute教程

    2019-04-24 11:07:00
    MaxCompute全套攻略:https://blog.csdn.net/qq_35394891/article/details/82943894 【2019年大数据福利推荐】MaxCompute教程、案例视频合集汇总(持续更新20190121):https://yq.aliyun.com/articles/686158 ...
  • MaxCompute介绍

    千次阅读 2018-09-04 11:03:30
    参考官方文档系列: ... 一 什么是MaxCompute 大数据计算服务(MaxCompute,原名ODPS open data processing service)是一种快速、完全托管的GB/TB/PB级数据仓库解决方案...
  • 初学MaxCompute

    2020-02-13 11:18:10
    MaxComputer是阿里云提供的一种全新的大数据计算服务,其具备更高效的计算及存储能力,本人的理解就是一个类似于HBase,Hive的云上的数据仓库。 参考官方文档系列: ...一 什么是MaxCompute 大数据计算服务(...
  • MaxCompute Next

    2017-03-15 10:34:08
    MaxCompute未来的展望,致力于建立一个兼容、开放、统一的计算平台。基于当初建立它的研发思路,下一代MaxCompute会更加理解运算,更加理解数据,更加理解用户。做到这三个层次的实例展现了更智能、更高效的优越性...
  • MaxCompute技术公开课第四季之如何将Kafka数据同步至MaxCompute.pdf
  • 文章目录一、Maxcompute在优酷的应用1.1 优酷业务的特点1.2 Maxcompute 简单易用1.3 Maxcompute 生态完善1.4 Maxcompute 性能强悍1.5 MaxCompute 资源弹性1.6 大数据整体方案1.7 数据分层1.8 业务赋能1.9 计算优化...
  • MaxCompute入门

    2019-04-03 17:03:53
    MaxCompute阿里云文档 https://help.aliyun.com/product/27797.html?spm=a2c4g.11186623.3.1.5e1839d3lRCkjJ 基本概念 ... Ma...
  • 我们在进行大数据开发过程中,会遇到各种问题,本文将定期收集整理一些在使用阿里云数加 MaxCompute SQL 过程中遇到的常见问题,供大家参考~ Q. 用 between …… and……报错,如图所示: A. MaxCompute SQL 的 ...
  • maxcompute笔记

    2019-02-18 11:24:00
    maxcompute安装和配置 https://help.aliyun.com/document_detail/27804.html?spm=a2c4g.11174283.3.5.566a590e0PB79r ================================= mysql与sql的不同 SELECT TOP 2 * FROM Persons SELECT...
  • MaxCompute基础与MaxCompute_SQL优化

    千次阅读 2017-05-11 14:41:37
    总论: 大数据计算服务 ( MaxCompute,原名 ODPS ) 是一种快速、完全托管的 TB/PB 级数据仓库解决方案 ...同时,大数据开发套件和 MaxCompute关系紧密,大数据开发套件为 MaxCompute 提供了一站式的数
  •  离线数据上云(hdfs/hbase/文件/RDS/OSS)->MaxCompute数仓内部数据处理- >ADS同步->应用查询及大屏离线展现等;  实时数据上云(日志)->DataHub->StreamCompute->RDS->大屏实时展现等。 实现一个实际的、...
  • 本次分享主要介绍MaxCompute安全模型与DataWorks安全模型之间的关联,同时介绍如何将两个产品有效的结合进行日常数据安全管理,保障数据安全。
  • MaxCompute快速入门

    2020-09-07 15:28:38
    MaxCompute快速入门一、创建和查看表1.登录客户端或者网页2.创建表。3.查看表。二、导入数据Tunnel命令导入数据1.准备数据。2.创建MaxCompute表。3.执行Tunnel命令。4.结果验证。三、运行SQL语句和导出数据1....
  • MaxCompute MapReduce

    2018-01-31 19:49:37
    摘要: 大数据计算服务(MaxCompute)的功能详解和使用心得 点此查看原文:http://click.aliyun.com/m/41384/ 前言 MapReduce已经有文档,用户可以参考文档使用。本文是在文档的基础上做一些类似注解及细节解释上的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,774
精华内容 1,509
关键字:

Maxcompute