【发布时间】:2023-01-28 12:15:21
【问题描述】:
我正在编写一个 Java UDF 函数,我想返回一个变体数组。看起来 Snowflake 支持返回各种 Java 原始类型和 String 的数组,但不支持 Variants。文档说 ARRAY 始终是 VARIANT 的数组,因此不支持这似乎很不寻常。我最接近的做法是将 UDF 函数返回类型指定为 ARRAY,但将 Java 函数返回类型指定为 String 并实质上返回一个 json 数组字符串。例如。
CREATE FUNCTION MY_FUNCTION()
RETURNS ARRAY
LANGUAGE JAVA
PACKAGES = ('com.snowflake:snowpark:1.7.0')
HANDLER = 'MyClass.myFunction'
AS $$
import java.util.stream.Stream;
import com.snowflake.snowpark_java.types.Variant;
public class MyClass {
public static String myFunction(Variant input) {
Variant[] result = EXTRACT_VALUES(input);
return "[" \\
+ Stream.of(result).map(Variant::asJsonString).collect(Collectors.joining(", ")) \\
+ "]";
}
}
$$;
需要理解的是,我事先不知道数组元素的类型,它们可以是同一数组中的不同类型。 Variant::asJsonString 之间的来回转换似乎不是最优的,尤其是因为 EXTRACT_VALUES 中的代码也可能来回转换元素
【问题讨论】:
标签: java snowflake-cloud-data-platform user-defined-functions variant