如何将 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
字段存储为雪花 Object
或 Variant
。为了简化问题,我们可以想象下一个查询在从 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 数据类型转换为雪花对象或变体的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 9.2 - 将 TEXT json 字符串转换为 json/hstore 类型