本文为您介绍UDF的常见问题。

UDF初始化时,系统是否会分配一个新的JVM来运行此UDF?是否有办法让所有UDF都运行在同一个JVM中?

MaxCompute SQL执行时内部有调度系统,会分配资源。资源分配不支持手动设置,但您可以设置JVM的内存。

UDF可以读取云上资源,是否可以创建写入的方法?UDF是否可以缓存数据?并让其他UDF直接获取缓存数据?

目前还不支持。

如何开启编写UDF的权限?

  • 问题现象:编写UDF,注册函数,执行时报错FAILED: Do not allow java UDF in project: xxx
  • 问题原因:出现上述报错,是因为您没有编写UDF权限,目前编写UDF的权限不是默认开放的。
  • 解决办法:如果您需要获得此权限,请通过工单进行申请。

自定义函数中用到了FastJson,打包Extract为fastjson-1.2.8.jar,使用该自定义函数时报错java.lang.NoClassDefFoundError是什么原因?

  • 问题现象:报错信息如下。
    java.lang.NoClassDefFoundError: java/io/Fi
  • 问题原因:FastJson被沙箱拦截了,您可以使用Gson包来实现,详情请参见Java沙箱

编写UDAF时,报错Resolve Annotation Not Found如何处理?

  • 问题现象: 编写UDAF的过程中,报错如下。
    FAILED: ODPS-0140051:Invalid function - com.aliyun.odps.udf.impl.AnnotationParser$ParseError: @Resolve annotation not found.        
  • 解决办法:UDAF需要设置@Resolve,例如,@Resolve({"double->double"}) 表示这个UDAF传入和传出的参数都是DOUBLE类型。

MaxCompute中是否有函数可以把2017-01-23转化为20170123?

有,请参见字符串函数中的REGEXP_REPLACE函数。

MaxCompute表的DECIMAL类型如何设置为保留2位小数?

建议您使用STRING数据类型,然后使用UDF实现数据的运算。或者您也可以考虑在计算结束后对数据执行round()命令。

MaxCompute有类似Group_oncat的函数吗?

有,请参见聚合函数中的WM_CONCAT

执行定时任务时某个节点运行失败,日志报错skynet_packageid is null,是什么原因造成的?

主要原因是没有获得具体运行SQL的AcessKey信息,存在以下几种可能性:
  • 如果是在数据开发界面直接运行时报错,请检查个人的AcessKey是否存在。
  • 如果是在运维中心运行时报错,请检查此任务对应的任务责任人的AcessKey是否存在。
  • 如果是在DataWorks的生产环境运行时报错,请检查主账号的AcessKey是否存在,如果不存在请更新主账号的AcessKey。

MaxCompute是否支持Scipy?

目前MaxCompute暂不支持Scipy,但您可以通过在MaxCompute UDF 中运行 Scipy实现对Scipy的支持。

如何通过自定义日志打印对UDAF进行线上调试?

在日常使用中会出现代码在本地IDE环境里调试成功,但是在线上调试结果不符合预期这种情况。主要是因为本地IDE里无法模拟多个Worker进行分布式调试UDAF的场景,所以一些缺陷在线上测试时才会暴露。

建议您使用手工打印日志(详情请参见《基于自定义日志打印的UDAF调试》)针对UDAF进行调试。

UDAF函数的参数是否支持任意参数类型?

目前UDF的参数必须指定类型,不支持任意参数类型。

对任意参数类型的支持可以使用Hive的GenericUDAF来实现,MaxCompute 2.0对Hive UDF进行了兼容,示例请参见Hive UDF兼容示例

MaxCompute是否支持Unicode编码?

MaxCompute不支持类似\u0001格式的Unicode编码。 如果您需要使用Unicode编码,可以将字符串写入MaxCompute表,通过select xxx from table的方式传入字段至UDF函数中进行处理。

如何使用UDF并行处理千万级数据?

您可以通过设置odps.stage.mapper.split.size参数控制Worker的数量,增加作业处理的并发数以提高效率。相同数据量下,该参数设置的越小,Worker数量越多,效率越高。详情请参见SET操作