使用复制命令和清单文件将 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 文件从 Azure 数据湖存储帐户复制到 Synapse 数据仓库表失败