Presto 自定义 UDF

Ace*_*rey 3 java presto

我创建了一个已注册的自定义 udf,但是当我尝试选择 custom_udf(10) 时出现以下错误: Exact implementation of BasicPlatform do not match expected java types 这是我的 udf,我似乎无法弄清楚它有什么问题:public class ScalarUdfs {

private ScalarUdfs() {};

@ScalarFunction("basic_platform")
@SqlType(StandardTypes.VARCHAR)
public static Slice BasicPlatform(@SqlNullable @SqlType(StandardTypes.INTEGER) Integer id) {
    final Slice IOS = Slices.utf8Slice("iOS");
    final Slice ANDROID = Slices.utf8Slice("Android");
    final Slice WEB = Slices.utf8Slice("Web");
    final Slice OTHER = Slices.utf8Slice("Other");
    final Map<Integer, Slice> PLATFORM_MAP = new HashMap<Integer, Slice>() {{
        put(20, IOS);
        put(42, ANDROID);
        put(100, WEB);
    }};

    if (id == null || !PLATFORM_MAP.containsKey(id)) {
        return OTHER;
    }
    return PLATFORM_MAP.get(id);
}
Run Code Online (Sandbox Code Playgroud)

}

有什么明显的错误吗?我希望它返回一个字符串,给定一个 int 作为参数,我认为 java 和 sql 类型匹配 (Integer -> Integer), (Slice -> varchar)。

谢谢

Pio*_*sen 5

presto-users上也提出并回答了这个问题:

您必须使用@SqlNullable @SqlType(StandardTypes.INTEGER) Long id(因为 SQLintegerLongJava支持)。

  • @AceHaidrey 我知道。为了未来的访客,也在这里回答。 (2认同)
  • @y2k-shubham 当值批量保存在内存中时,它们会被有效地保存。当对单个值进行操作时(例如,调用 UDF 时),为了简单起见,所有整型类型都使用“long”。Presto 针对 64 位处理器进行了优化,在字节、短整型、整数等较窄/较小的类型上运行不会带来任何好处,同时在代码库中带来不可忽略的维护负担。 (2认同)
  • @y2k-shubham 请参阅“com.facebook.presto.spi.type.Type#getJavaType”。`VARCHAR` 用 `io.airlift.slice.Slice` 表示。 (2认同)