AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何使用 Amazon Redshift 中的 SUPER 数据类型处理和查询 JSON 数据?
我想使用 Amazon Redshift 中的 SUPER 数据类型处理和查询 JSON 数据。
简短描述
使用 SUPER 数据类型将半结构化数据存储在您的 Amazon Redshift 数据仓库中。您可以使用 PartiQL 语言查询 SUPER 数据类型。
您还可以使用 Amazon Redshift Spectrum 来支持半结构化数据。
解决方法
您可以使用 COPY 命令或 INSERT 命令和 JSON_PARSE 函数将 JSON 加载到 SUPER 数据中。加载大型数据时,最佳做法是使用 COPY 命令。
使用 COPY 命令
使用 COPY 命令从 Amazon Simple Storage Service (Amazon S3) 中的数据文件加载 JSON。有关详细信息,请参阅将半结构化数据加载到 Amazon Redshift。
要将 JSON 加载到单个 SUPER 数据列中,请使用 noshred 选项。
要将 JSON 加载到多个列中,请使用 auto(自动)选项或指定 jsonpaths 文件。当您使用 auto(自动)选项时,COPY 会将顶层 JSON 属性与列名进行匹配,并允许您将嵌套值作为 SUPER 值加载。以下示例演示如何使用 auto(自动)选项。
JSON 数据文件示例:
{"r_regionkey":0,"r_name":"AFRICA","r_nations":[{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}]} {"r_regionkey":1,"r_name":"AMERICA","r_nations":[{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}]} {"r_regionkey":2,"r_name":"ASIA","r_nations":[{"n_nationkey":8,"n_name":"INDIA"}]}
COPY 命令示例:
# CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_nations super ); # COPY region_nations FROM 's3://<S3 path to the JSON data file>' IAM_ROLE '<IAM role>' FORMAT JSON 'auto'; # SELECT * FROM region_nations; r_regionkey | r_name | r_nations -------------+---------+------------------------------------------------------------------------------------------------------------------- 0 | AFRICA | [{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}] 1 | AMERICA | [{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}] 2 | ASIA | [{"n_nationkey":8,"n_name":"INDIA"}] (3 rows)
将文本或 .csv 文件中的 JSON 数据加载到 SUPER。确保它采用有效的 JSON 格式。Amazon Redshift 对 .csv 文件使用标准转义规则。
.csv 文件示例:
r_regionkey,r_name,r_nations 0,AFRICA,"[{""n_nationkey"":11,""n_name"":""ALGERIA""},{""n_nationkey"":5,""n_name"":""ETHIOPIA""},{""n_nationkey"":14,""n_name"":""KENYA""}]" 1,AMERICA,"[{""n_nationkey"":1,""n_name"":""ARGENTINA""},{""n_nationkey"":2,""n_name"":""BRAZIL""}]" 2,ASIA,"[{""n_nationkey"":8,""n_name"":""INDIA""}]"
COPY 命令示例:
# CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_nations super ); # COPY region_nations FROM 's3://<S3 path to the CSV file>' IAM_ROLE '<IAM role>' FORMAT CSV IGNOREHEADER 1; # SELECT * FROM region_nations; r_regionkey | r_name | r_nations -------------+---------+------------------------------------------------------------------------------------------------------------------- 0 | AFRICA | [{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}] 1 | AMERICA | [{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}] 2 | ASIA | [{"n_nationkey":8,"n_name":"INDIA"}] (3 rows)
使用 INSERT 命令和 JSON_PARSE 函数
JSON_PARSE 函数解析 JSON 格式的数据,并将其转换为可以与 INSERT 命令一起使用的 SUPER 数据类型。
命令示例:
# CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_nations super ); # INSERT INTO region_nations VALUES(0,'AFRICA',json_parse('[{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}]')); # INSERT INTO region_nations VALUES(1,'AMERICA',json_parse('[{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}]')); # INSERT INTO region_nations VALUES(2,'ASIA',json_parse('[{"n_nationkey":8,"n_name":"INDIA"}]')); # SELECT * FROM region_nations; r_regionkey | r_name | r_nations -------------+---------+------------------------------------------------------------------------------------------------------------------- 0 | AFRICA | [{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}] 1 | AMERICA | [{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}] 2 | ASIA | [{"n_nationkey":8,"n_name":"INDIA"}] (3 rows)
使用 PartiQL 查询 SUPER 数据
Amazon Redshift 使用 PartiQL 语言对关系型、半结构化和嵌套数据进行与 SQL 兼容的访问。有关详细信息,请参阅查询半结构化数据。
查询示例:
# SELECT * FROM region_nations; r_regionkey | r_name | r_nations -------------+---------+------------------------------------------------------------------------------------------------------------------- 0 | AFRICA | [{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}] 1 | AMERICA | [{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}] 2 | ASIA | [{"n_nationkey":8,"n_name":"INDIA"}] (3 rows) # SELECT region_nations.r_nations[1].n_name FROM region_nations; n_name ------------ "ETHIOPIA" "BRAZIL" (3 rows) # SELECT rn.r_regionkey, rn.r_name, n FROM region_nations rn, rn.r_nations n; r_regionkey | r_name | n -------------+---------+---------------------------------------- 0 | AFRICA | {"n_nationkey":11,"n_name":"ALGERIA"} 0 | AFRICA | {"n_nationkey":5,"n_name":"ETHIOPIA"} 0 | AFRICA | {"n_nationkey":14,"n_name":"KENYA"} 1 | AMERICA | {"n_nationkey":1,"n_name":"ARGENTINA"} 1 | AMERICA | {"n_nationkey":2,"n_name":"BRAZIL"} 2 | ASIA | {"n_nationkey":8,"n_name":"INDIA"} (6 rows)
将 SUPER 数据卸载到 JSON 文件中
您可以使用 UNLOAD 命令从 SUPER 数据类型提取数据,并将其作为 JSON 文档存储在 S3 中。
命令示例:
# SELECT * FROM region_nations; r_regionkey | r_name | r_nations -------------+---------+------------------------------------------------------------------------------------------------------------------- 0 | AFRICA | [{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}] 1 | AMERICA | [{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}] 2 | ASIA | [{"n_nationkey":8,"n_name":"INDIA"}] (3 rows) # UNLOAD ('SELECT * FROM region_nations') TO 's3://<S3 path>' IAM_ROLE '<IAM role>' FORMAT JSON;
JSON 文档示例:
{"r_regionkey":0,"r_name":"AFRICA","r_nations":[{"n_nationkey":11,"n_name":"ALGERIA"},{"n_nationkey":5,"n_name":"ETHIOPIA"},{"n_nationkey":14,"n_name":"KENYA"}]} {"r_regionkey":1,"r_name":"AMERICA","r_nations":[{"n_nationkey":1,"n_name":"ARGENTINA"},{"n_nationkey":2,"n_name":"BRAZIL"}]} {"r_regionkey":2,"r_name":"ASIA","r_nations":[{"n_nationkey":8,"n_name":"INDIA"}]}
- 语言
- 中文 (简体)
