用Java代码调用MaxCompute

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对应章节,本文不再展开说明。

上一篇:eclipse配置tomcat运行时访问路径不要项目名称


下一篇:如何将个性化需求变成大数据解决方案