本文以在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;
}
}