如何将 Postgres Hstore 数据类型转换为雪花对象或变体

Posted

技术标签:

【中文标题】如何将 Postgres Hstore 数据类型转换为雪花对象或变体【英文标题】:How to convert Postgres Hstore data type to Snowflake Object or Variant 【发布时间】: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 函数,但我无法使用这种方法来解决我的问题

【问题讨论】:

【参考方案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”

【讨论】:

以上是关于如何将 Postgres Hstore 数据类型转换为雪花对象或变体的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 聚合 Hstore

PostgreSQL 9.2 - 将 TEXT json 字符串转换为 json/hstore 类型

如何在 Postgres 中的 JSON 字段上创建索引?

如何使用 PySpark 将 JSON 列类型写入 Postgres?

如何在 postgres 中插入货币数据类型值

如何修改postgres数据库中的json字段