在 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 中存储的特定行的默认值在哪里?