从 S3 中的 Parquet 清单复制 Redshift 失败,并表示 MANIFEST 参数需要 S3 对象的完整路径

Redshift copy from Parquet manifest in S3 fails and says MANIFEST parameter requires full path of an S3 object

我正在使用 Firehose 将 Parquet 格式的记录放入 S3 存储桶中。我已经手动定义了一个胶水 table.

所以我有一个像

这样的清单
{
  "entries": [
    {"url":"s3://my-bucket/file1.parquet"},
    {"url":"s3://my-bucket/file2.parquet"}
  ]
}

还有像

这样的复制命令
COPY schema_name.table_name
FROM 's3://my-bucket/manifest.json'
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456:role/RoleWithPermissionToRedshiftAndBucket'
PARQUET
MANIFEST;

它给出了这个神秘的错误,在 Google 上有 0 个结果。

[XX000][500310] [Amazon](500310) Invalid operation: COPY with MANIFEST parameter requires full path of an S3 object.
Details:
-----------------------------------------------
error:  COPY with MANIFEST parameter requires full path of an S3 object.
code:      8001
context:
query:     23514459
location:  scan_range_manager.cpp:795
process:   padbmaster [pid=108497]
-----------------------------------------------;

在我看来,我肯定指定了完整路径,所以我不确定发生了什么。

有一件事是错误的,那就是存储桶在不同的区域,这也会阻止它工作。

您可能会收到此错误消息的一个原因是存储桶位于另一个 aws 帐户中。

但实际上为我修复它的是将 content_length 添加到清单中,因为镶木地板需要它。

{
  "entries": [
    {
      "url":"s3://my-bucket/file1.parquet",
      "mandatory":true,
      "meta":{
        "content_length":2893394
      }
    },
    {
      "url":"s3://my-bucket/file2.parquet",
      "mandatory":true,
      "meta":{
        "content_length":2883626
      }
    }
  ]
}


显然,如果您将 content_length 排除在外,您将收到一条不相关的错误消息。这家伙犯了同样的错误并收到一条错误消息说

File has an invalid version number

Error while loading parquet format file into Amazon Redshift using copy command and manifest file

确保您设置了正确的凭据或 IAM_ROLE。

我修复了这个完全相同的错误 COPY with MANIFEST parameter requires full path of an S3 object 通过更改我的 IAM_ROLE - 从没有权限加载到这个 table.

(这方面的 Redshift 错误信息不好)。