Presto 或 Trino 自定义 UDF 得到“不匹配预期的 Java 类型错误”

Posted

技术标签:

【中文标题】Presto 或 Trino 自定义 UDF 得到“不匹配预期的 Java 类型错误”【英文标题】:Presto or Trino Custom UDF getting "do not match expected java types error" 【发布时间】:2022-01-09 19:25:08 【问题描述】:

我创建了一个已注册的自定义 udf,但是当我尝试运行 select do_protect('abc@test.com','Test_EMAIL'); 时出现以下错误:

io.trino.spi.TrinoException:do_protect 的确切实现与预期的 java 类型不匹配

这是我的 Trino udf。我想传递两个字符串(VARCHAR)参数。

@ScalarFunction("do_protect")
@Description("Return encrypted string")
@SqlType(StandardTypes.VARCHAR)
public String protectUDF(@SqlType(StandardTypes.VARCHAR) Slice slice1, @SqlType(StandardTypes.VARCHAR) Slice slice2) throws PrivaceraException 
        logger.info("protectUDF get called...");

        String valueForEncrypt = slice1.toString();
        logger.info("AS :: valueForEncrypt :: "+valueForEncrypt);
        String schemeForEncrypt = slice2.toString();
        logger.info("AS :: schemeForEncrypt :: "+schemeForEncrypt);


【问题讨论】:

【参考方案1】:

我认为错误在于VARCHARSlice 的映射。相反,我认为它应该映射到string,如下所示:

protectUDF(@SqlType(StandardTypes.VARCHAR) string slice1, @SqlType(StandardTypes.VARCHAR) string slice2)

我在 Stack Overflow 上发现了一个类似的问题:

Presto Custom UDF

这让我看到了一篇文章,其中显示了 VARCHAR 的映射是 String

“CHAR、VARCHAR 和 LONGVARCHAR 可以映射到 String 或 char[],但 String 更适合正常使用。”

https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html

【讨论】:

以上是关于Presto 或 Trino 自定义 UDF 得到“不匹配预期的 Java 类型错误”的主要内容,如果未能解决你的问题,请参考以下文章

大数据Presto:Presto自定义函数和JDBC连接

Facebook 抢占商标,PrestoSQL 无奈选择更名 Trino

Presto 中的用户定义函数

Tardigrade:Trino 解决 ETL 场景的方案

试图让 Excel UDF 自定义单元格格式不返回任何内容“(空单元格)”或“格式化的用户输入”

Pig用户自定义函数(UDF)转