【问题标题】:How best to return a Variant Array from a Java UDF如何最好地从 Java UDF 返回 Variant Array
【发布时间】: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 中的代码也可能来回转换元素

(来自https://community.snowflake.com/s/question/0D5Do00000D7qYtKAJ/how-best-to-return-a-variant-array-from-a-java-udf

【问题讨论】:

    标签: java snowflake-cloud-data-platform user-defined-functions variant


    【解决方案1】:

    不要试图返回变体数组。如果你这样做,你会得到错误:

    100315 (P0000): Unsupported return type: com.snowflake.snowpark_java.types.Variant[] in function JAVA_VARIANTS with handler MyClass.myFunction

    相反,使用 Variant 也可以是数组这一事实,因此只需返回 Variant:

    CREATE OR REPLACE FUNCTION java_variants(x variant)
    RETURNS variant
    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 Variant myFunction(Variant input) {
                return input;
            }
        }
    $$;
    
    select java_variants([1, {'a':3}, '2020-09-12'::date])::array;
    
    -- [   1,   {     "a": 3   },   "2020-09-12" ]
    

    我们可以更深入——例如,我们可以将输入 Variant 转换为 Array,然后将该 Array 转换回 Variant:

            public static Variant myFunction(Variant input) {
                return new Variant(input.asArray());
            }
    

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2013-02-15
      • 1970-01-01
      • 2017-02-05
      • 2013-03-14
      相关资源
      最近更新 更多