带有 jsonpaths 的 Redshift 复制 JSON 数据失败并出现不正确的 json 格式错误

Posted

技术标签:

【中文标题】带有 jsonpaths 的 Redshift 复制 JSON 数据失败并出现不正确的 json 格式错误【英文标题】:Redshift copy JSON data with jsonpaths fails with not in correct json format error 【发布时间】:2020-11-25 17:29:49 【问题描述】:

我正在尝试使用 Firehose 传输流将数据加载到 Redshift。

我在以下位置使用上传到 S3 的 jsonpaths 文件。

s3://my_bucket/jsonpaths.json

此文件包含以下 jsonpaths 配置


    "jsonpaths": [
        "$['col_1']",
        "$['col_2']",
        "$['col_3']",
        "$['col_4']"
    ]

对我来说,这个配置看起来不错,但 Firehose Redshift 日志一直显示以下错误。

"The provided jsonpaths file is not in a supported JSON format."

即使我直接在 Redshift 集群上运行以下复制命令,也会看到类似的错误。

reshift_db=# COPY my_schema.my_table 
FROM 's3://my_bucket/data.json' 
FORMAT JSON 's3://my_bucket/jsonpaths.json'
CREDENTIALS 'aws_iam_role=<role_arn>'
;
ERROR:  Manifest file is not in correct json format
DETAIL:  
  -----------------------------------------------
  error:  Manifest file is not in correct json format
  code:      8001
  context:   Manifest file location = s3://my_bucket/jsonpaths.json
  query:     yyyyy
  location:  s3_utility.cpp:338
  process:   padbmaster [pid=xxxxx]
  -----------------------------------------------

有人可以帮忙解决这里出了什么问题吗?

【问题讨论】:

【参考方案1】:

我的问题是 jsonpaths 文件开头的 BOM (Byte Order Mark)。一些编辑器可以使用 BOM 保存文件,在编辑器中看到时,这不会显示为字符。而且显然 Redshift 不喜欢 jsonpaths 文件开头的 BOM。

如果您想检查您的 jsonpaths 文件是否属于这种情况,您可以在十六进制编辑器中打开该文件。对于 S3 文件,可以按如下方式完成。

# aws s3 cp s3://my_bucket/jsonpaths.json - | hexdump -C

要从文件中删除 BOM,您可以执行以下操作。

# aws s3 cp s3://my_bucket/jsonpaths.json - | dos2unix | aws s3 cp - s3://my_bucket/jsonpaths.json

几乎在尝试了 2 天之后,在提出 AWS Support 票证并发布了这个问题之后,它告诉我应该在十六进制编辑器中检查文件。

【讨论】:

以上是关于带有 jsonpaths 的 Redshift 复制 JSON 数据失败并出现不正确的 json 格式错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Data Pipeline DynamoDB 到 S3 到 Redshift,包括 JsonPaths

如何创建 Jsonpath 文件以在 redshift 中加载数据

用于动态 json 文件的 Redshift JSONPaths 文件

复制 json 文件时出现 Amazon Redshift 错误 - JSONPath 格式无效:成员不是对象

带有 JsonTextReader 的 JsonPath:一次标记

带有JSONPath的JSON.NET SelectToken