如何将 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 表的单个列的主要内容,如果未能解决你的问题,请参考以下文章
使用 COPY 命令将数据从 JSON 文件复制到 Redshift