【问题标题】:How to convert Postgres Hstore data type to Snowflake Object or Variant如何将 Postgres Hstore 数据类型转换为雪花对象或变体
【发布时间】:2021-09-14 08:47:11
【问题描述】:

我正在将 Postgres DB 迁移到 Snowflake 并面临下一个问题。我的输入是存储在s3 中的csv 文件,其中包含Postgres 表的数据。我想将 Postgres HSTORE 字段存储为雪花 ObjectVariant。为了简化问题,我们可以想象下一个查询在从 s3 读取我们的 csv 数据后包含一个 hstore 字段,如下所示:'"User__id"=>"31486183"',我需要像 '{"User__id":"31486183"}' 这样的格式,Snowflake 将其理解为 JSON。例如:

select parse_json('"User__id"=>"31486183"')

抛出以下错误。

SQL 编译错误:位置 28 处的第 1 行语法错误意外 '=>'。位置 28 处的第 1 行语法错误意外'=>'。

我们想把那个表达式转换成另一个:

select parse_json('{"User__id":"31486183"}')

{ "User__id": "31486183" }

我发现的唯一解决方法是将 Postgres 端的 HSTORE 字段转换为 hstore_to_json 函数,但我无法使用这种方法来解决我的问题

【问题讨论】:

    标签: postgresql type-conversion migration snowflake-cloud-data-platform hstore


    【解决方案1】:

    我发现但我想避免的解决方法是手动转换格式:

    select parse_json(CONCAT('{',REPLACE('"User__id"=>"31486183"','=>',':'),'}'));
    

    { "User__id": "31486183" }

    我们可以用这个逻辑创建一个函数:

    CREATE OR REPLACE FUNCTION CONVERT_HSTORE_TO_JSON(str STRING) RETURNS VARIANT AS 'select PARSE_JSON(CONCAT(\'{\',REPLACE(str,\'=>\',\':\'),\'}\'))';
    

    并以更清洁的方式使用它(但不是更有效):

    select CONVERT_HSTORE_TO_JSON('"User__id"=>"31486183"');
    

    并以 JSON 字段的形式访问我们的字段:

    select CONVERT_HSTORE_TO_JSON('"User__id"=>"31486183"'):"User__id";
    

    “31486183”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2020-05-14
      • 2013-01-06
      • 2019-04-09
      相关资源
      最近更新 更多