在 Redshift 中以通用方式将 JSON 数据扩展为新列

Posted

技术标签:

【中文标题】在 Redshift 中以通用方式将 JSON 数据扩展为新列【英文标题】:expand a JSON data into new columns in a generic fashion in Redshift 【发布时间】:2017-02-01 12:19:22 【问题描述】:

我有一个类似的数据库表

SomeSchema

ID      Params
1234    'normalized_CR': 1.111434628975265, 'Rating': 0.0, Rank': 1410
1235    'normalized_CR': 1.123142131, 'Rating': 1.0, Rank': 210

如何在 Redshift 中将此数据扩展为同名的单独列?

我在网上搜索,但得到的结果主要是json_extract_path,它只能得到一个键。

【问题讨论】:

【参考方案1】:

经过大量谷歌搜索,事实证明目前还没有简单的方法可以做到这一点,而蛮力方法就是前进的道路。另外,上面的数据不是有效的 Json(' 而不是"):

select
  id,
  json_extract_path_text(REPLACE(Params, '\'', '"'), 'normalized_CR') as normalized_CR,
  json_extract_path_text(REPLACE(Params, '\'', '"'), 'Rating') as Rating,
  json_extract_path_text(REPLACE(Params, '\'', '"'), 'Rank') as Rank
from
    DB.SomeSchema
order by
    id desc
limit 100;

【讨论】:

【参考方案2】:

使用 json_extract_path_text 如另一个答案中所述可能是最直接的方法。

如果您需要更大的灵活性,另一种方法是创建 user defined function 并使用 Python 的 JSON 解析器来提取您想要的内容。

类似这样的东西(未经测试):

CREATE FUNCTION extract_json(json_string VARCHAR, field VARCHAR)
RETURNS varchar
IMMUTABLE AS $$
import json
return json.loads(json_string)[field]
$$ LANGUAGE plpythonu;

像这样使用它:

SELECT extract_json(Params, "Rank")
FROM SomeSchema;

More info.

【讨论】:

【参考方案3】:

另一种方法(尽管它涉及 S3)是使用 UNLOAD 命令在 S3 中下载文件,然后使用带有选项“COPY FROM JSON”的 COPY 命令。

UNLOAD command

COPY FROM JSON command

【讨论】:

以上是关于在 Redshift 中以通用方式将 JSON 数据扩展为新列的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP / Laravel 中以抽象的方式包装 JSON 响应

我可以使用AWS Glue将S3上的json数据转换为柱状格式并将其推送到Redshift吗?

amazon redshift 中存储的特定行的默认值在哪里?

在 Redshift 中存储事件数据的最佳方式是啥?

将具有多个嵌套级别的任何 XML 读取到结构化表中以写入 Excel 的通用方法

使用复制命令将 Json 文件加载到 redshift