将半结构化数据加载到 Amazon Redshift 中 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将半结构化数据加载到 Amazon Redshift 中

使用 SUPER 数据类型可保留和查询 Amazon Redshift 中的分层数据和查询通用数据。Amazon Redshift 引入了 json_parse 函数,以 JSON 格式解析数据,并将其转换为 SUPER 表示形式。Amazon Redshift 还支持加载 JSON 文档,而无需将其 JSON 结构的属性分成多个列。

SUPER 数据类型的默认编码为 LZO。

将 JSON 文档解析为 SUPER 列

您可以使用 JSON_PARSE 函数将 JSON 数据插入或更新到 SUPER 列中。该函数会解析 JSON 格式的数据,并将其转换为可在 INSERT 或 UPDATE 语句中使用的 SUPER 数据类型。

以下示例将 JSON 数据插入到 SUPER 列中。如果查询中缺少 JSON_PARSE 函数,Amazon Redshift 会将值视为单个字符串,而不是必须解析的 JSON 格式的字符串。

如果您更新 SUPER 数据列,则 Amazon Redshift 要求将完整文档传递到列值。Amazon Redshift 不支持部分更新。

INSERT INTO region_nations VALUES(0, 'lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to', 'AFRICA', JSON_PARSE('{"r_nations":[ {"n_comment":" haggle. carefully final deposits detect slyly agai", "n_nationkey":0, "n_name":"ALGERIA" }, {"n_comment":"ven packages wake quickly. regu", "n_nationkey":5, "n_name":"ETHIOPIA" }, {"n_comment":" pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t", "n_nationkey":14, "n_name":"KENYA" }, {"n_comment":"rns. blithely bold courts among the closely regular packages use furiously bold platelets?", "n_nationkey":15, "n_name":"MOROCCO" }, {"n_comment":"s. ironic, unusual asymptotes wake blithely r", "n_nationkey":16, "n_name":"MOZAMBIQUE" } ] }'));

在 Amazon Redshift 中使用 COPY 加载 JSON 数据

使用 COPY 命令可将格式化为 JSON、ORC 和 Parquet 的数据加载到 SUPER 数据列中。中的半结构化数据支持使您能够加载 JSON 文档,而无需将其 JSON 结构的属性分成多个列。即使对于完全未知或部分未知的 JSON 结构,Amazon Redshift 也提供了两种方法来提取 JSON 文档:Amazon Redshift

  • 将派生自 JSON 文档的数据存储到单个 SUPER 数据列中。当架构未知或需要更改时,此方法很有用。因此,更轻松地将整个元组存储在单个 SUPER 列中。

  • 将 JSON 文档移入多个 Amazon Redshift 列。属性可以是 Amazon Redshift 标量或 SUPER 值。

将 JSON 文档复制到单个 SUPER 数据列中

要将 JSON 文档复制到单个 SUPER 数据列中,请创建一个具有单个 SUPER 数据列的表。

CREATE TABLE region_nations_noshred (rdata SUPER);

将数据从 Amazon S3 复制到单个 SUPER 数据列中。在 FORMAT JSON 子句中指定 noshred 选项以将 JSON 源数据提取到单个 SUPER 数据列中。

COPY region_nations_noshred FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 'noshred';

在 COPY 成功提取 JSON 后,客户表将具有包含整个 JSON 对象数据的 cdata SUPER 数据列。提取的数据将保留 JSON 层次结构的所有属性,但树叶将转换为 Amazon Redshift 标量类型以实现有效的查询处理。

使用以下查询通过以下查询检索原始 JSON 字符串:

SELECT rdata FROM region_nations_noshred;

此外,当 Amazon Redshift 生成 SUPER 数据列时,可通过 JSON 序列化将 JDBC 用作字符串以访问该数据列。有关更多信息,请参阅 Serializing complex nested JSON.

将 JSON 文档复制到多个 SUPER 数据列中

您可以将 JSON 文档按节面创建为多个列,这些列可以是 SUPER 数据列或 Amazon Redshift 标量类型。Amazon Redshift 将 JSON 对象的不同部分分布到不同的列。

CREATE TABLE region_nations ( r_regionkey smallint ,r_name varchar ,r_comment varchar ,r_nations super );

为了将上一个示例的数据 COPY 复制到此表中,请使用带 FORMAT JSON 的 AUTO 选项运行 COPY 命令,以跨多个列拆分 JSON 值。COPY 与具有列名的 JSON 属性匹配,并允许将嵌套值(例如 JSON 数组和对象)作为 SUPER 值提取。

COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT JSON 'auto';

可以使用以下查询访问显示数据分配到多个列的表。SUPER 数据列是使用 JSON 格式打印的。

SELECT r_regionkey,r_name,r_comment,r_nations[0].n_nationkey FROM region_nations ORDER BY 1,2,3 LIMIT 1;

从 Parquet 和 ORC 列式复制数据

如果您的半结构化或嵌套数据已经以 Apache Parquet 或 Apache ORC 格式提供,则可以使用 COPY 命令将数据提取到 Amazon Redshift 中。表结构应与 Parquet 或 ORC 文件的列数和列数据类型匹配。Amazon Redshift通过在 COPY 命令中指定 SERIALIZETOJSON,可将文件中与表中的 SUPER 列对齐的任何列类型作为 SUPER 加载,包括结构和数组类型。

COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/parquet/region_nation' REGION 'us-east-1' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT PARQUET SERIALIZETOJSON;

以下示例使用 ORC 格式。

COPY region_nations FROM 's3://redshift-downloads/semistructured/tpch-nested/data/orc/region_nation' IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxx:role/Redshift-S3' FORMAT ORC SERIALIZETOJSON;