MaxCompute客户端命令
最新的MaxCompute服务对常用命令做了调整,新的命令风格更贴近于Hive的使用方式,方便原有的Hadoop和Hive用户。MaxCompute提供了对项目空间、表、资源和实例等对象的一系列操作。您可以通过客户端命令或SDK来操作这些对象。包括:
- 项目空间操作
- 表操作
- 实例操作
- 资源操作
- 函数操作
- SET操作
- 时区配置操作(暂略,具体见:时区配置操作)
- 其他
对于MaxCompute客户端命令,可以使用odpscmd客户端进行运行,也可以使用IDEA MaxCompute Studio中创建的SQL Script文件中运行。客户端和基本开发环境的构建见:MaxCompute基础开发环境搭建。下面命令在IDEA MaxCompute Studio中创建的SQL Script文件运行。
具体内容参考自:MaxCompute官方文档。
项目空间操作命令
1. 进入项目空间(use)
-- 使用项目空间
use YITIAN_BJ_MC;
2. 访问该项目空间下的表
select * from emp;
3. 访问另一项目空间下的对象,需要指定项目空间名:
--在my_project_test空间下访问另一项目空间my_project2下的表test_src。
odps @ my_project_test>select * from my_project2.test_src;
4. 列出所有项目空间(list projects)
-- 列出所有项目空间
list projects;
-- 返回结果
Project Name Comment Creation Time Last Modified Time
yitian_bj_dev 2020-04-15 15:49:07 2020-04-15 15:49:07
yitian_bj_dev_dev 2020-04-15 15:49:15 2020-04-15 15:49:15
yitian_bj_mc 2019-05-29 17:26:39 2020-02-17 13:57:51
yitian_bj_mc_dev 2019-05-29 17:26:51 2020-02-17 13:57:53
yitian_maxcompute 2019-05-29 11:25:24 2020-02-17 13:57:55
yitian_maxcompute_s_dev 2019-05-29 11:32:36 2020-02-17 13:57:57
5. 设置项目空间属性(setproject)
-- 命令格式
setproject <KEY>=<VALUE>;
-- 设置允许全表扫描
setproject odps.sql.allow.fullscan=true;
--显示setproject设置的参数。
setproject;
Project属性可设置的选项见:Project属性详细说明。
6. 设置IP白名单
-- 设置公网下IP白名单
setproject odps.security.ip.whitelist= IP Address
-- 设置VPC网络下IP白名单
setproject odps.security.vpc.whitelist= RegionID_VPCID[IP address]
白名单中具体IP的配置见:项目空间操作。
表操作
1. 创建表(create table)
-- 命令格式
CREATE TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[LIFECYCLE days]
[AS select_statement]
CREATE TABLE [IF NOT EXISTS] table_name
LIKE existing_table_name
其中需要说明的是:
IF NOT EXISTS: 在创建表时,如果不指定IF NOT EXISTS
选项而存在同名表,则返回出错;如果指定此选项,则无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元信息不会被改动。
PARTITIONED BY:指定表的分区字段。MaxCompute 1.0版仅支持STRING类型。MaxCompute 2.0版对分区类型的支持进行了扩充,支持TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING分区类型。当利用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,提高处理效率。
LIFECYCLE:指明此表的生命周期,仅支持正整数。单位:天。
- 对于非分区表:自最后一次数据被修改开始计算,经过days天后数据仍未被改动,则此表无需您干预,将会被MaxCompute自动回收(类似drop table操作)。
- 对于分区表:根据各分区的LastDataModifiedTime判断该分区是否该被回收。不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。生命周期只能设定到表级别,不能在分区级设置生命周期。
--如果没有同名表存在,创建一张分区表sale_deail。
CREATE TABLE IF NOT EXISTS sale_detail(
shop_name STRING,
customer_id STRING,
total_price DOUBLE)
PARTITIONED BY (sale_date STRING,region STRING);
--创建非分区表test1。
create table test1 (key string);
--创建分区表test2。
create table test2 (key bigint) partitioned by (pt string, ds string);
--创建带有生命周期的表test3。
create table test3 (key boolean) partitioned by (pt string, ds string) lifecycle 100;
-- 除生命周期属性外,test4的其他属性(字段类型、分区类型等)均与test3完全一致。
create table test4 like test3;
-- 这个操作会创建test5,但分区生命周期信息不会被拷贝到目标表中。此操作仅会将test2的数据复制到test5中(如果test2有数据,此示例中test2为空表,后续章节会介绍数据导入)。
create table test5 as select * from test2;
2. 修改表的owner(alter table)
-- 命令格式
ALTER TABLE table_name CHANGEOWNER to new_owner;
-- 将表test1的所有人修改为ALIYUN$xxx@aliyun.com。
ALTER TABLE test1 CHANGEOWNER to 'ALIYUN$xxx@aliyun.com';
3. 删除表(drop table)
-- 命令格式
DROP TABLE [IF EXISTS] table_name;
--删除表sale_detail。如果表存在,返回成功。
DROP TABLE sale_detail;
--删除表sale_detail。无论sale_detail表是否存在,均返回成功。
DROP TABLE IF EXISTS sale_detail;
如果不指定IF EXISTS
选项而表不存在,则返回异常;如果指定此选项,无论表是否存在,均返回成功。
4. 查看表信息(desc)
-- 查看表或者视图信息
DESC <table_name>;
-- 查看外部表信息
DESC extended <table_name>;
具体返回的信息如下:
- Owner:表的属主。
- Project:表所属的项目空间。
- CreateTime:创建时间。
- LastDDLTime:最后一次DDL操作时间。
- LastModifiedTime:表中的数据最后一次被改动的时间。
- InternalTable:表示被描述的对象是表,总是显示YES。
- Size:表数据所占压缩后的存储容量大小,压缩比一般为5倍,单位Byte。
- Native Columns:非分区列的信息,包括列名、类型和备注。
- Partition Columns:分区列信息,包括分区名、类型和备注。
- Extended Info:外部表StorageHandler 、Location等信息。
DESC sale_detail;
-- 返回信息
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$yitian.z@foxmail.com | Project: yitian_bj_mc |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2019-05-31 10:43:36 |
| LastDDLTime: 2019-05-31 10:43:36 |
| LastModifiedTime: 2019-05-31 14:59:55 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 1440 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | | |
| customer_id | string | | |
| total_price | double | | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| sale_date | string | |
| region | string | |
+------------------------------------------------------------------------------------+
5. 查看表的分区信息(desc partitions)
-- 命令格式
desc table_name partition(pt_spec);
-- 使用示例
desc meta.m_security_users partition (ds='20151010');
+------------------------------------------------------------------------------------+
| PartitionSize: 2109112 |
+------------------------------------------------------------------------------------+
| CreateTime: 2015-10-10 08:48:48 |
| LastDDLTime: 2015-10-10 08:48:48 |
| LastModifiedTime: 2015-10-11 01:33:35 |
+------------------------------------------------------------------------------------+
OK
6. 查看项目空间的表(show tables)
-- 列出当前项目空间下所有的表
SHOW TABLES;
-- 列出当前项目空间下表名与'chart'匹配上的表,支持正则表达式
SHOW TABLES like 'chart';
7. 查看表的分区信息(show partitions)
-- 命令格式
SHOW PARTITIONS table_name;
-- 使用示例
SHOW PARTITIONS sale_detail;
-- 返回信息
sale_date=201312/region=hangzhou
OK
列出一张表中的所有分区,表不存在或非分区表时报错。
实例操作
在MaxCompute中,部分任务(Task)在执行时会被实例化,以MaxCompute实例(下文简称为实例或Instance)的形式存在。
1. 查看示例信息(Show Instances/Show P)
-- 命令格式
SHOW INSTANCES [FROM startdate TO enddate] [number];
SHOW P [FROM startdate TO enddate] [number];
SHOW INSTANCES [-all];
SHOW P [-all];
SHOW P -p <project name>;
参数说明
- startdate、enddate:返回指定时间段内提交的实例,即从起始时间startdate到结束时间enddate提交的实例信息,需满足格式:yyyy-mm-dd,精度到天。可选参数,如果不指定,则返回您在三天内提交的实例。
- number:指定返回实例的数量。依照时间排序,返回提交距离当前时间最近的number个实例信息。如果不指定number,则返回满足要求的所有实例信息。
- -all:返回当前项目下所有执行过的实例,默认最大返回50条。注意执行该命令的用户需要有项目空间的List权限。如果需要返回更多条记录,请使用-limit number参数,例如
show p -all -limit 100
表示返回当前项目下100条执行过的实例记录。 - project name:项目名称,您使用的账号必须已经是项目成员。
返回由当前用户创建的实例信息。查询结果输出项包括:StartTime(时间精确到秒)、RunTime(s)、Status(实例状态)。Instance有以下6种状态:
- Running:正在运行。
- Success:成功结束。
- Waiting:等待中。
- Failed:作业失败,但是尚未改写目标表数据。
- Suspended:挂起。
- Cancelled:被中止。
2. 查看实例状态(Status Instance)
-- 命令格式
status instance_id;
功能说明:返回指定实例的状态,状态包括Success、Failed、Running和Cancelled。
3. Top Instance
-- 返回当前项目中当前账号所提交的正在执行的作业信息
top instance;
-- 返回当前项目下所有正在执行的作业,默认最大返回50条。如需返回更多条记录,请使用-limit number参数
top instance -all;
4. 停止实例
-- 停止指定的实例,此实例的状态必须为Running。
kill instance_id;
5. 查询实例信息
desc instance instance_id;
6. 查看实例日志信息(Wait Instance)
-- 根据具体的实例ID获得任务运行日志信息,包含Logview链接。再通过查看Logview可以获得任务的详细日志
wait instance_id;
资源操作
1. 添加资源
-- 命令格式
add file <local_file> [as alias] [comment 'cmt'][-f];
add archive <local_file> [as alias] [comment 'cmt'][-f];
add table <table_name> [partition (spec)] [as alias] [comment 'cmt'][-f];
add <PY | JAR> <localfile[.py |.jar]> [COMMENT 'cmt'][-f];
参数说明
- file/archive/table/jar/py:表示资源类型。
- local_file:表示本地文件所在路径。并以此文件名作为该资源名,资源名是资源的唯一标识。
- table_name:表示MaxCompute中的表名。目前不支持添加外部表为资源。
- [PARTITION (spec)]:当添加的资源为分区表时,MaxCompute仅支持将某个分区作为资源,不支持将整张分区表作为资源。
- alias:指定资源名,不加该参数时默认文件名为资源名。Jar及Python类型资源不支持此参数。
- [comment'cmt']:给资源添加注释。
- [-f]:当存在同名的资源时,此操作会覆盖原有资源。如果不指定此选项,存在同名资源时,操作将失败。
2. 查看资源列表
-- 命令格式
LIST RESOURCES;
3. 下载资源
GET RESOURCE <resource_name> <path>;
功能说明:下载MaxCompute中的资源到本地。资源类型必须为File、Jar、Archive或Py,不支持Table类型。
参数说明
- resource_name:要下载的资源名称。
- path:资源保存到本地的路径。
4. 删除资源
DROP RESOURCE <resource_name>;
函数操作
1. 注册函数
-- 命令格式
CREATE FUNCTION <function_name> AS <package_to_class> USING <resource_list>;
参数说明
- function_name:新建的UDF函数名称。函数名称需要唯一,同名函数只能注册一次。
- package_to_class:包名,此名称须用引号引起。
- Java UDF,此名称为从顶层包名一直到实现UDF类的类名。
- Python UDF,此名称为Python脚本名.类名。
- resource_list:UDF所用到的资源列表。
- 此资源列表必须包括UDF代码所在的资源,且资源已经上传至MaxCompute。
- 如果您的代码通过Distributed Cache接口读取资源文件,此列表中还要包括UDF所读取的资源文件列表。
- 资源列表由多个资源名组成,资源名之间由逗号分隔,且资源列表必须用引号引起。
- 如果需要指定资源所在的Project,写法为
<project_name>/resources/<resource_name>
。
-- 创建函数my_lower。假设Java UDF类org.alidata.odps.udf.examples.Lower在my_lower.jar中。
CREATE FUNCTION my_lower AS 'org.alidata.odps.udf.examples.Lower' USING 'my_lower.jar';
-- 创建函数test_udtf。假设Java UDF类com.aliyun.odps.examples.udf.UDTFResource是在udtfexample1.jar中,同时该函数还依赖File资源file_resource.txt、Table资源table_resource1以及Archive资源test_archive.zip。
create function test_udtf as 'com.aliyun.odps.examples.udf.UDTFResource' using 'udtfexample1.jar, file_resource.txt, table_resource1,test_archive.zip';
2. 注销函数
DROP FUNCTION <function_name>;
3. 查看函数清单
-- 查看当前项目空间中的所有自定义函数
LIST FUNCTIONS;
-- 查看指定项目空间下的所有自定义函数
LIST FUNCTIONS -p project_name;
Set操作
set命令设置MaxCompute或用户自定义的系统变量,区别与setproject命令:
- set命令:对当前Session设置MaxCompute系统变量。
- setproject命令:project级别的系统变量设置
-- 命令格式
set <KEY>=<VALUE>
可用的key和value属性值见:MaxCompute的Set操作。
其他操作
1. Alias命令
-- 命令格式
alias <alias>=<real>;
功能说明:为资源创建别名。Alias命令可以在不修改代码的前提下,在MapReduce或UDF代码中,通过某个固定的资源名读取不同资源(数据)。
参数说明
- alias:命名后的资源别名。
- real:资源的原名。
--新增资源res_20121208和res_20121209。
ADD TABLE sale_detail PARTITION (ds='20121208') AS res_20121208;
ADD TABLE sale_detail PARTITION (ds='20121209') AS res_20121209;
--命名资源res_20121208的别名为resName,并调用它。
ALIAS resName=res_20121208;
jar -resources resName -libjars work.jar -classpath ./work.jar com.company.MainClass args ...; // 作业一。
--命名资源res_20121209的别名为resName,并调用它。
ALIAS resName=res_20121209;
jar -resources resName -libjars work.jar -classpath ./work.jar com.company.MainClass args ...; // 作业二。
2. 计量预估(Cost SQL命令)
cost sql <SQL Sentence>;
功能说明:预估出一条SQL的计量信息,包含输入数据的大小、UDF个数以及SQL复杂等级。但该信息不能作为实际计费标准,仅供参考,实际费用请以账单为准。
cost sql select distinct project_name, user_name from meta.m_security_users distribute by project_name sort by project_name;
ID = 20150715113033121xxxxxxx
Input:65727592 Bytes
UDF:0
Complexity:1.0