本文以在MaxCompute Studio操作为例,为您介绍如何在Java UDF中使用复杂数据类型。

前提条件

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

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

UDF代码示例

如下代码中,定义了3个重载的evaluate方法。其中:
  • 第一个用ARRAY作为参数,ARRAY对应java.util.List。
  • 第二个用MAP作为参数,MAP对应java.util.Map。
  • 第三个用STRUCT作为参数,STRUCT对应com.aliyun.odps.data.Struct。
    说明 com.aliyun.odps.data.Struct无法通过反射分析获取到field name和field type,需要辅助使用@Resolve annotation,即如果您需要在UDF中使用STRUCT,要求在UDF class上也标注上@Resolve注解,该注解只会影响参数或返回值中包含com.aliyun.odps.data.Struct的重载。
import com.aliyun.odps.data.Struct;
import com.aliyun.odps.udf.UDF;
import com.aliyun.odps.udf.annotation.Resolve;
import java.util.List;
import java.util.Map;

@Resolve("struct<a:string>,string->string")
public class UdfArray extends UDF {
    //接收两个参数,第一个参数对应ARRAY复杂数据类型,第二个参数对应要获取的元素的index,目的是要取出位于index位置的元素。
    public String evaluate(List<String> vals, Long index) { 
        return vals.get(index.intValue());
    }
    //接收两个参数,第一个参数对应MAP复杂数据类型,第二个参数对应要取出的Key,目的是要取出Key对应的值。
    public String evaluate(Map<String, String> map, String key) {
        return map.get(key);
    }
    //接收两个参数,第一个参数对应STRUCT复杂数据类型,第二个参数为一个Key值,目的是要取出STRUCT中成员变量a对应的值,并在其后增加Key值以STRING格式返回。
    public String evaluate(Struct struct, String key) {
        return struct.getFieldValue("a") + key;
    }
}

操作步骤

  1. 在MaxCompute Studio中新建UDF类型的Java程序。例如Java Class名称为UdfArray,程序代码为UDF代码示例中的代码。
    更多创建UDF操作,请参见编写UDF编写UDF
  2. 在本地运行调试UDF,确保代码可以运行成功。
    更多调试操作,请参见通过本地运行调试UDF调试UDF
    说明 运行参数可参照图示数据填写。
  3. 将创建的UDF打包为JAR包,上传至MaxCompute项目并注册函数。例如函数名称为my_index
    更多打包操作,请参见操作步骤打包
  4. 在MaxCompute Studio的左侧导航栏,单击Project Explorer,在目标MaxCompute项目上单击右键,启动MaxCompute客户端,并执行SQL命令调用新创建的UDF。
    运行SQL调用UDF命令示例如下。
    select my_index(array('a', 'b', 'c'), 0); --返回a。
    select my_index(map('key_a','val_a', 'key_b', 'val_b'), 'key_b'); --返回val_b。
    select my_index(named_struct('a', 'hello'), 'world'); --返回hello world。