在 Redshift 中以通用方式将 JSON 数据扩展到新列中
expand a JSON data into new columns in a generic fashion in Redshift
我有一个数据库table喜欢
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
,只能得到一个密钥。
经过多次谷歌搜索,结果证明目前还没有简单的方法可以做到这一点,蛮力方法是未来的方法。此外,上面的数据无效 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;
使用其他答案中描述的 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;
另一种方法(尽管它涉及 S3)是使用 UNLOAD 命令下载 S3 中的文件,然后使用带选项 'COPY FROM JSON' 的 COPY 命令。
我有一个数据库table喜欢
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
,只能得到一个密钥。
经过多次谷歌搜索,结果证明目前还没有简单的方法可以做到这一点,蛮力方法是未来的方法。此外,上面的数据无效 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;
使用其他答案中描述的 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;
另一种方法(尽管它涉及 S3)是使用 UNLOAD 命令下载 S3 中的文件,然后使用带选项 'COPY FROM JSON' 的 COPY 命令。