本文为您介绍基于MaxCompute Studio通过Java UDTF读取MaxCompute资源的使用示例。

前提条件

已安装MaxCompute Studio,并连接至MaxCompute项目,创建了MaxCompute Java Module。

更多操作信息,请参见安装MaxCompute Studio管理项目连接创建MaxCompute Java Module

更多MaxCompute资源信息,请参见资源

UDTF代码示例

package com.aliyun.odps.examples.udf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import com.aliyun.odps.udf.ExecutionContext;
import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
/**
 * project: example_project 
 * table: wc_in2 
 * partitions: p2=1,p1=2 
 * columns: colc,colb
 */
@Resolve("string,string->string,bigint,string")
public class UDTFResource extends UDTF {
  ExecutionContext ctx;
  long fileResourceLineCount;
  long tableResource1RecordCount;
  long tableResource2RecordCount;
  @Override
  public void setup(ExecutionContext ctx) throws UDFException {
  this.ctx = ctx;
  try {
   InputStream in = ctx.readResourceFileAsStream("file_resource.txt");
   BufferedReader br = new BufferedReader(new InputStreamReader(in));
   String line;
   fileResourceLineCount = 0;
   while ((line = br.readLine()) != null) {
     fileResourceLineCount++;
   }
   br.close();
   Iterator<Object[]> iterator = ctx.readResourceTable("table_resource1").iterator();
   tableResource1RecordCount = 0;
   while (iterator.hasNext()) {
     tableResource1RecordCount++;
     iterator.next();
   }
   iterator = ctx.readResourceTable("table_resource2").iterator();
   tableResource2RecordCount = 0;
   while (iterator.hasNext()) {
     tableResource2RecordCount++;
     iterator.next();
   }
 } catch (IOException e) {
   throw new UDFException(e);
 }
}
   @Override
   public void process(Object[] args) throws UDFException {
     String a = (String) args[0];
     long b = args[1] == null ? 0 : ((String) args[1]).length();
     forward(a, b, "fileResourceLineCount=" + fileResourceLineCount + "|tableResource1RecordCount="
     + tableResource1RecordCount + "|tableResource2RecordCount=" + tableResource2RecordCount);
    }
}

操作步骤

  1. 在MaxCompute Studio的顶部菜单栏,选择MaxCompute > 添加资源,添加如下资源文件。
    添加资源
    资源文件 资源类型 资源内容
    file_resource.txt file 您可以在MaxCompute客户端的如下位置获取示例资源文件。示例资源
    table_resource1 table
    table_resource2 table
  2. 在MaxCompute Studio中新建UDTF类型的Java程序。例如Java Class名称为UDTFResource,程序代码为UDTF代码示例中的代码。
    更多创建UDTF操作,请参见编写UDF编写UDTF
  3. 在本地运行调试UDTF,确保代码可以运行成功。
    更多调试操作,请参见通过本地运行调试UDF调试
    说明 运行参数可参照图示数据填写。
  4. 将创建的UDTF打包为JAR包,上传至MaxCompute项目并注册函数。例如函数名称为my_udtf
    更多打包操作,请参见操作步骤注册函数Extra resources需要选中步骤1中添加的三个资源文件。
  5. 在MaxCompute Studio的左侧导航栏,单击Project Explorer,在目标MaxCompute项目上单击右键,启动MaxCompute客户端,并执行SQL命令调用新创建的UDTF。
    调用UDFSQL代码示例如下。
    select my_udtf("10","20") as (a, b, fileResourceLineCount) from tnp1; 
    返回结果如下。
    +-------+------------+-------+
    | a | b      | fileResourceLineCount |
    +-------+------------+-------+
    | 10    | 2          | fileResourceLineCount=3|tableResource1RecordCount=0|tableResource2RecordCount=0 |
    | 10    | 2          | fileResourceLineCount=3|tableResource1RecordCount=0|tableResource2RecordCount=0 |
    +-------+------------+-------+