在 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;

More info.

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

UNLOAD command

COPY FROM JSON command