解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)

Mil*_*lka 6 json amazon-redshift snowflake-cloud-data-platform

我正在尝试将查询从 Redshift 转换为 Snowflake SQL。

Redshift 查询如下所示:

SELECT 
                cr.creatives as creatives
                , JSON_ARRAY_LENGTH(cr.creatives) as creatives_length
                , JSON_EXTRACT_PATH_TEXT(JSON_EXTRACT_ARRAY_ELEMENT_TEXT (cr.creatives,0),'previewUrl') as preview_url
FROM campaign_revisions cr
Run Code Online (Sandbox Code Playgroud)

雪花查询如下所示:

SELECT 
                cr.creatives as creatives
                , ARRAY_SIZE(TO_ARRAY(ARRAY_CONSTRUCT(cr.creatives))) as creatives_length
                , PARSE_JSON(PARSE_JSON(cr.creatives)[0]):previewUrl as preview_url
FROM campaign_revisions cr
Run Code Online (Sandbox Code Playgroud)

似乎 JSON_EXTRACT_PATH_TEXT 未正确转换,因为 Snowflake 查询会导致错误:

解析 JSON 时出错:输入中有多个文档

cr.creatives 的格式如下:

"[{""previewUrl"":""https://someurl.com/preview1.png"",""device"":""desktop"",""splitId"":null,""splitType"":null},{""previewUrl"":""https://someurl.com/preview2.png"",""device"":""mobile"",""splitId"":null,""splitType"":null}]"
Run Code Online (Sandbox Code Playgroud)

joh*_*taa 2

在我看来,您没有在 Snowflake 中使用有效的 JSON 数据。

请检查用于复制到命令的文件格式。

如果您在文本编辑器中打开提供的“JSON”文本,请注意,由于您的引用,该信息不会被解析或格式化为 JSON。一旦处理了双引号/转义引号的问题,您应该能够取得良好的进展

左侧正确的 JSON || 右侧原始数据 无效 JSON 与有效 JSON

如果您不想重新加载数据,请查看是否可以创建 Javascript 用户定义函数来删除字符串中的引号,然后您可以使用 Snowflake 来处理变体列。

以下代码是有效的 POJO,可用于为您删除双引号。

var textOriginal = '[{""previewUrl"":""https://someurl.com/preview1.png"",""device"":""desktop"",""splitId"":null,""splitType"":null},{""previewUrl"":""https://someurl.com/preview2.png"",""device"":""mobile"",""splitId"":null,""splitType"":null}]';


function parseText(input){
    var a = input.replaceAll('""','\"');
    a = JSON.parse(a);
    return  a;
}


x = parseText(textOriginal);
console.log(x);
Run Code Online (Sandbox Code Playgroud)

请参阅此处 JS 函数的输出