如何将 JSON 文件加载到 Redshift 表的单个列

Posted

技术标签:

【中文标题】如何将 JSON 文件加载到 Redshift 表的单个列【英文标题】:How to load a JSON file to a single column of a Redshift table 【发布时间】:2020-09-14 07:54:38 【问题描述】:

我正在尝试将以下 JSON 示例从 S3 加载到 Redshift 表中的单个列作为概念证明。但是,它无法成功运行。对此的任何帮助都会有很大帮助。

(这只是一个带有随机值的示例 JSON,用于检查它是否正常工作)


    "Name":"ABC",
    "Department":"HR",
    "Rollno":1,
    "Salary":1000,
    "RS Factor":4,
    "Expected Value":8.1,
    "Comment": "", 
    "Correction Factor": 1,
    "Fruit":"Apple",
    "Size":"Large",
    "Color":"Red"

使用的复制命令:

COPY "schema"."table" ("column") FROM 's3://bucketname/file.json' 
WITH CREDENTIALS AS 'aws_access_key_id=XXXXXX;aws_secret_access_key=XXXXXX' 
MAXERROR AS 0 DATEFORMAT AS 'auto' TIMEFORMAT AS 'auto' 
ACCEPTANYDATE TRIMBLANKS 
EMPTYASNULL 
BLANKSASNULL 
COMPUPDATE OFF 
STATUPDATE OFF ROUNDEC 
JSON AS 'auto' 
ENCODING AS UTF8 ACCEPTINVCHARS AS '?' 
IGNOREHEADER AS 0

【问题讨论】:

“到单列”是什么意思?是否希望该字段包含显示的完整 JSON blob?您能否向我们展示您期望的输出示例?通常,最好将 JSON 属性加载到单独的列中,以便 Redshift 可以轻松查询它们。虽然 Redshift 确实包含一些解析 JSON 字段的函数,但这些表不会针对查询进行优化。 我们的最终目标是将整个 JSON 结构插入到单个列中,因为 JSON 字段本质上是动态的。是否有可能或者我们是否需要使用像 mongo 或 dynamo 这样的无模式数据库 无论是否可行,以这种格式加载数据对于 Amazon Redshift 来说都不是一个好主意。 Amazon Redshift 的真正强大之处在于跨节点分布数据(分布键)和对数据进行排序,以便WHERE 语句高效(排序键)。如果您希望将数据存储为 JSON blob,它将无法利用 Redshift 可以提供的任何好处。如果这是您希望存储在 Redshift 中的主要/唯一数据,那么您应该以真正的行/列格式存储它,或者使用不同类型的数据库。 【参考方案1】:

您需要添加 json 'noshred' 而不是 auto 。就这样 。它将json加载到单列而不将其分成多列

COPY "schema"."table" ("column") FROM 's3://bucketname/file.json' 
WITH CREDENTIALS AS 'aws_access_key_id=XXXXXX;aws_secret_access_key=XXXXXX' 
MAXERROR AS 0 DATEFORMAT AS 'auto' TIMEFORMAT AS 'auto' 
ACCEPTANYDATE TRIMBLANKS 
EMPTYASNULL 
BLANKSASNULL 
COMPUPDATE OFF 
STATUPDATE OFF ROUNDEC 
JSON 'noshred'
ENCODING AS UTF8 ACCEPTINVCHARS AS '?' 
IGNOREHEADER AS 0

【讨论】:

以上是关于如何将 JSON 文件加载到 Redshift 表的单个列的主要内容,如果未能解决你的问题,请参考以下文章

JSON 数据加载到 Redshift 表中

使用复制命令将 Json 文件加载到 redshift

将 JSON 文件加载到 Redshift

使用 COPY 命令将数据从 JSON 文件复制到 Redshift

如何以 JSON 格式转换 debezium 消息,以便可以将其加载到 Redshift

AWS Glue - Redshift 中具有 Json 结构的字段