MaxCompute的客户端的工具odpscmd是好东西,什么都能干。但是它不方便在自己的代码做很好的集成,毕竟它是个Shell脚本。那有什么办法把MaxCompute的作业、设置和自己的代码做无缝集成呢,MaxComput SDK就能干这个。本文就实际的工作中最常见的几个场景,做一些示例。详细的使用可以在Maven上下到SDK的文档说明。
其实这里面的很多写法都是文档里有的,或者在帮助文档里有写过类似的例子。这里就做算是做个整理吧。
对象操作
其实官方的SDK文档里,对这方面的介绍是最多的了,可以参考这里。这里我再针对实际场景里的比较多的创建表和分区做个例子,相信看完这些后对这方面就没有疑惑了
String access_id = "your access id";
String access_key = "your access key";
String endpoint = "http://service.odps.aliyun.com/api";
String project = "testproject";
String tableName = "testCreate";
String partition = "ds='20170614'";
Account account = new AliyunAccount(access_id, access_key);
Odps odps = new Odps(account);
odps.setEndpoint(endpoint);
odps.setDefaultProject(project);
TableSchema schema = new TableSchema();
schema.addColumn(new Column("col_str",OdpsType.STRING,"column string"));
schema.addColumn(new Column("col_datetime",OdpsType.DATETIME,"column datetime"));
schema.addColumn(new Column("col_int",OdpsType.BIGINT,"column bigint"));
schema.addColumn(new Column("col_double",OdpsType.DOUBLE,"column double"));
schema.addColumn(new Column("col_boolean",OdpsType.BOOLEAN,"column boolean"));
schema.addPartitionColumn(new Column("ds",OdpsType.STRING,"partition column"));
PartitionSpec ps= new PartitionSpec(partition);
try {
odps.tables().create(tableName, schema);
odps.tables().get(tableName).createPartition(ps);
} catch (OdpsException e) {
e.printStackTrace();
}
odps@ testproject>desc testCreate;
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$cloudtecengr@aliyun.com | Project: testproject |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2017-06-14 20:00:48 |
| LastDDLTime: 2017-06-14 20:00:48 |
| LastModifiedTime: 2017-06-14 20:00:48 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| col_str | string | | column string |
| col_datetime | datetime | | column datetime |
| col_int | bigint | | column bigint |
| col_double | double | | column double |
| col_boolean | boolean | | column boolean |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| ds | string | partition column |
+------------------------------------------------------------------------------------+
OK
odps@ testproject>show partitions testCreate;
ds=20170614
OK
SQL
上文的提到的SDK文档里有个例子,可以用来提交SQL。
另外前面提到的创建表的操作,也可以用这里的SQLTask跑Create Table的SQL来实现。
说到SQL就少不了要说JDBC,目前有基于SQLTask开源做了个JDBC的实现,可以参考这里。
授权
授权不能直接用SQLTask来做,不过有类似的方法
com.aliyun.odps.security.SecurityManager securityManager = odps.projects().get().getSecurityManager();
String res = securityManager.runQuery("grant all on table wc_in to user aliyun$xxxxxxxxx@aliyun.com;", false);
MapReduce
针对这个问题,我写了一篇文档可以参考下
Graph
图计算我们把这个功能写进了产品文档,可以参考这里。这里的ss.setLocalRun(false);
如果是Ture就是本地调试,如果是false就是在云上跑作业。
Tunnel
Tunnel可以参考Tunnel SDK对应章节,本文不再展开说明。