team470 发表于 2018-10-20 12:24:23

导出SQL运行结果的方法总结

private static final String accessId = "userAccessId";    private static final String accessKey = "userAccessKey";    private static final String endPoint = "http://service.odps.aliyun.com/api";    private static final String project = "userProject";    private static final String sql = "userSQL";    private static final String table = "Tmp_" + UUID.randomUUID().toString().replace("-", "_");//其实也就是随便找了个随机字符串作为临时表的名字  
    private static final Odps odps = getOdps();    public static void main(String[] args) {
  
      System.out.println(table);
  
      runSql();
  
      tunnel();
  
    }    /*
  
   * 把SQLTask的结果下载过来
  
   * */
  
    private static void tunnel() {
  
      TableTunnel tunnel = new TableTunnel(odps);      try {
  
            DownloadSession downloadSession = tunnel.createDownloadSession(                  project, table);
  
            System.out.println("Session Status is : "
  
                  + downloadSession.getStatus().toString());            long count = downloadSession.getRecordCount();
  
            System.out.println("RecordCount is: " + count);
  
            RecordReader recordReader = downloadSession.openRecordReader(0,                  count);
  
            Record record;            while ((record = recordReader.read()) != null) {
  
                consumeRecord(record, downloadSession.getSchema());
  
            }
  
            recordReader.close();
  
      } catch (TunnelException e) {
  
            e.printStackTrace();
  
      } catch (IOException e1) {
  
            e1.printStackTrace();
  
      }
  
    }    /*
  
   * 保存这条数据
  
   * 数据量少的话直接打印后拷贝走也是一种取巧的方法。实际场景可以用Java.io写到本地文件,或者写到远端数据等各种目标保存起来。
  
   * */
  
    private static void consumeRecord(Record record, TableSchema schema) {
  
      System.out.println(record.getString("username")+","+record.getBigint("cnt"));
  
    }    /*
  
   * 运行SQL,把查询结果保存成临时表,方便后面用Tunnel下载
  
   * 这里保存数据的lifecycle为1天,所以哪怕删除步骤出了问题,也不会太浪费存储空间
  
   * */
  
    private static void runSql() {
  
      Instance i;
  
      StringBuilder sb = new StringBuilder("Create Table ").append(table)
  
                .append(" lifecycle 1 as ").append(sql);      try {
  
            System.out.println(sb.toString());
  
            i = SQLTask.run(getOdps(), sb.toString());
  
            i.waitForSuccess();
  

  
      } catch (OdpsException e) {
  
            e.printStackTrace();
  
      }
  
    }    /*
  
   * 初始化MaxCompute(原ODPS)的连接信息
  
   * */
  
    private static Odps getOdps() {
  
      Account account = new AliyunAccount(accessId, accessKey);
  
      Odps odps = new Odps(account);
  
      odps.setEndpoint(endPoint);
  
      odps.setDefaultProject(project);      return odps;
  
    }


页: [1]
查看完整版本: 导出SQL运行结果的方法总结