使用复制命令和清单文件将 parquet 格式文件加载到 Amazon Redshift 时出错

Posted

技术标签:

【中文标题】使用复制命令和清单文件将 parquet 格式文件加载到 Amazon Redshift 时出错【英文标题】:Error while loading parquet format file into Amazon Redshift using copy command and manifest file 【发布时间】:2019-07-09 00:40:52 【问题描述】:

我正在尝试使用清单文件加载 parquet 文件并出现以下错误。

查询:124138 由于内部错误而失败。文件 'https://s3.amazonaws.com/sbredshift-east/data/000002_0 的版本号无效:)

这是我的复制命令

从“s3://sbredshift-east/manifest/supplier.manifest”复制测试表 IAM_ROLE 'arn:aws:iam::123456789:role/MyRedshiftRole123' 拼花格式 清单;

这是我的清单文件

**  
   "entries":[  
        
         "url":"s3://sbredshift-east/data/000002_0",
         "mandatory":true,
         "meta":  
            "content_length":1000
         
      
   ]
**

我可以通过指定文件名使用复制命令加载相同的文件。

从 's3://sbredshift-east/data/000002_0' IAM_ROLE 'arn:aws:iam::123456789:role/MyRedshiftRole123' FORMAT AS PARQUET 复制测试表;

信息:加载到表“供应商”已完成,800000 条记录已成功加载。 复制

我的副本声明中可能有什么问题?

【问题讨论】:

您找到解决方案了吗? 如果您找到解决方案,请告诉我们。我没有看到 AWS 提供的有关使用清单加载镶木地板文件的适当文档 我无法让它与使用 MANIFEST VERBOSE 卸载的镶木地板文件一起使用,尝试所有建议的“内容”和“元”属性排列。我的解决方案是在没有清单的情况下重新卸载为 CSV。我的目标是更改主键列的数据类型。经过时间和数据占用的差异可以忽略不计,但此时我在 50-60 个表中的数据不足 20GB,最大行数为 5400 万。 【参考方案1】:

当 content_length 值错误时会发生此错误。您必须指定正确的 content_length。您可以执行 s3 ls 命令来检查它。

aws s3 ls s3://sbredshift-east/data/
2019-12-27 11:15:19        539 sbredshift-east/data/000002_0

539(文件大小)应与清单文件中的 content_lenght 值相同。

当您在直接复制命令中不需要它时,我不知道他们为什么要使用这个元值。

¯\_(ツ)_/¯

【讨论】:

【参考方案2】:

我得到 parquet 副本以使用清单文件的唯一方法是添加带有 content_length 的元键。

根据我在错误日志中收集到的信息,parquet(w/manifest)的 COPY 命令可能首先使用 Redshift Spectrum 作为外部表来读取文件。如果是这种情况,这个隐藏的步骤确实需要 content_step,这与他们关于 COPY 命令的初始声明相矛盾。

https://docs.amazonaws.cn/en_us/redshift/latest/dg/loading-data-files-using-manifest.html

【讨论】:

以上是关于使用复制命令和清单文件将 parquet 格式文件加载到 Amazon Redshift 时出错的主要内容,如果未能解决你的问题,请参考以下文章

大数据:Parquet文件存储格式

大数据:Parquet文件存储格式

将 Parquet 文件从 Azure 数据湖存储帐户复制到 Synapse 数据仓库表失败

将 Parquet 转换为 CSV

如何找到 Parquet 文件生成时使用的 COMPRESSION_CODEC?

我们可以使用复制命令使用访问密钥和秘密密钥将数据从 S3 加载到红移表中吗(不使用 IAM 角色)