【问题标题】:How to load Avro array of records into Vertica ARRAY如何将 Avro 记录数组加载到 Vertica ARRAY
【发布时间】:2021-08-11 18:55:50
【问题描述】:

我的 avro 文件包含以下列:

{"name":"my_column","type":["null",{"type":"array","items":{"type":"record","name":"my_column","namespace":"v11","fields":[{"name":"my_column","type":["null","int"],"default":null}]}}],"default":null}

我将数据加载到 Vertica 并存储为 VARBINARY。示例:

db=> select MapToString(my_column) from tab limit 1;
                                                                     MapToString
------------------------------------------------------------------------------------------------------------------------------------------------------
 {
    "0.__name__": "my_column",
    "0.my_column": "5",
    "1.__name__": "my_column",
    "1.my_column": "9"
}
(1 row)

数据实际上可以简化为ARRAY[INT]。 (即ARRAY[5,9])。

执行此转换的正确方法是什么? 通过 UDTF 或 UDParser 扩展 Vertica?通过 SQL 执行此转换?还有什么?

编辑:我将检查标量 UDF 是否可以与 AVROPARSER 一起嵌入到 COPY 命令中,或者它是否需要额外的 ETL。

谢谢!

【问题讨论】:

    标签: vertica


    【解决方案1】:

    尝试具体化列 - 好吧,您需要知道在弹性表中会发生什么......

    我先有这张桌子:

    SELECT                                                                                                                                                                     
      __id__
    , REGEXP_REPLACE(MAPTOSTRING(__raw__),'\s+',' ') AS rawasstring
    FROM a;
    -- out  __id__ |                                           rawasstring                                            
    -- out --------+--------------------------------------------------------------------------------------------------
    -- out         | { "0.__name__": "my_column", "0.my_column": "5", "1.__name__": "my_column", "1.my_column": "9" }
    -- out (1 row)
    

    然后,我只是添加了一个物化列,如下所示:

    ALTER TABLE a ADD int_array ARRAY[int,10] 
    DEFAULT ARRAY[
      MAPLOOKUP(__raw__, '0.my_column')
    , MAPLOOKUP(__raw__, '1.my_column')
    , MAPLOOKUP(__raw__, '2.my_column')
    , MAPLOOKUP(__raw__, '3.my_column')
    , MAPLOOKUP(__raw__, '4.my_column')
    , MAPLOOKUP(__raw__, '5.my_column')
    , MAPLOOKUP(__raw__, '6.my_column')
    , MAPLOOKUP(__raw__, '7.my_column')
    , MAPLOOKUP(__raw__, '8.my_column')
    , MAPLOOKUP(__raw__, '9.my_column')
    ]::ARRAY[INT,10];                                                                                                                                                           
    

    Map 中不存在的键为 NULL,并没有真正添加到数组中。现在我有了数组:

    SELECT                                                                                                                                                                     
      __id__::VARCHAR
    , REGEXP_REPLACE(MAPTOSTRING(__raw__),'\s+',' ') AS rawasstring
    , int_array
    FROM a ;
    -- out  __id__ |                                           rawasstring                                            | int_array 
    -- out --------+--------------------------------------------------------------------------------------------------+-----------
    -- out         | { "0.__name__": "my_column", "0.my_column": "5", "1.__name__": "my_column", "1.my_column": "9" } | [5,9]
    -- out (1 row)
    

    【讨论】:

    • 但是接下来我需要知道数组的元素个数,其实是任意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多