运行Vertica UDSF时出错

时间:2015-12-17 08:37:58

标签: bigdata cluster-computing user-defined-functions vertica

我正在尝试在vertica中创建用户定义的标量函数(UDSF),因此我正在扩展ScalarFunctionFactory和ScalarFunction类(来自vertica sdk)。扩展ScalarFunction的强制重写方法定义如下:

 public void getPrototype(ServerInterface serverInterface, ColumnTypes argTypes,ColumnTypes returnType) {
    argTypes.addLongVarchar(); // varchar input argument 1
    argTypes.addLongVarchar(); // varchar input argument 2
    returnType.addLongVarchar(); //varchar output
}

我为此创建了一个库和一个函数(参考有关部署UDSF的vertica文档),但是当尝试运行它时,我收到以下错误:

  

UDx RPC调用失败InvokeGetReturnType():用户定义对象[my_udf]出错,错误代码:0数据类型需要长度/精度规范。

我尝试设置参数的长度,但是要求argTypes为'SizedColumnTypes'类型,而不是'ColumnTypes',这是getPrototype的必需签名,因为它是强制覆盖。如果有人建议解决这个问题,那将会非常有用。

1 个答案:

答案 0 :(得分:1)

使用 getReturnType()定义输出字符串的最大长度。示例:

virtual void getPrototype(ServerInterface &interface,
                          ColumnTypes &argTypes,
                          ColumnTypes &returnType)
{
    argTypes.addVarchar();
    argTypes.addVarchar();
    returnType.addVarchar();
}

virtual void getReturnType(ServerInterface &srvInterface, 
                           const SizedColumnTypes &inputTypes, 
                           SizedColumnTypes &outputTypes)
{
    int len1 = inputTypes.getColumnType(1).getStringLength();
    int len2 = inputTypes.getColumnType(2).getStringLength();

    // Output size as sum of input string sizes:
    outputTypes.addVarchar(len1+len2, "column");
}