0

我有一个像这样的数据库表

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只能得到一个键。

4

3 回答 3

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;
于 2017-02-01T12:30:15.293 回答
0

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

如果您需要更大的灵活性,另一种方法是创建一个用户定义的函数并使用 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;

更多信息

于 2017-02-02T18:52:11.643 回答
0

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

卸载命令

从 JSON 命令复制

于 2017-02-05T03:19:38.993 回答