首页 > 解决方案 > 红移。从 S3 上的无效 JSON 复制

问题描述

我正在尝试将数据从 S3 上的 JSON 文件加载到 Redshift。

但此文件包含格式错误 - 行 QUOTES '$'

${"id":1,"title":"title 1"}$
${"id":2,"title":"title 2"}$

从 PostgreSQL 导出数据时出错。

现在,当我尝试将数据加载到 Redshift 中时,我收到 raw_line "$" 的消息 "Invalid value"。

有什么方法可以使用 Redshift COPY 命令转义这些符号并避免数据重新上传或转换?

我的命令

-- CREATE TABLE
create table my_table (id BIGINT, title VARCHAR);

-- COPY DATA FROM S3
copy my_table from 's3://my-bucket/my-file.json' 
credentials 'aws_access_key_id=***;aws_secret_access_key=***'
format as json 'auto'

提前致谢!

标签: amazon-redshift

解决方案


我认为没有一个简单的“忽略此”选项适用于您的情况。您可以尝试NULL AS '$',但我希望这只会以不同的方式混淆事物。

最好的办法是过滤文件并用固定版本替换原件。正如您在评论中指出的那样,将它们下载到您的系统中,由于大小的原因,修改和推回并不是一个好的选择。这将影响您的传输速度(通过 Internet)和 S3 的数据输出成本。您想在 AWS 的“内部”执行此操作。

有很多方法可以做到这一点,我希望最佳选择将基于您可以快速完成的操作,而不是绝对的最佳方法。(听起来这是一次修复操作。)这里有一些:

  • 启动一个 EC2 实例并对 AWS 内部的这个系统执行下载-修改-上传过程。请记住在您的 VPC 中有一个 S3 终端节点。
  • 创建一个 Lambda 函数以将数据流入、修改并推回 S3。只需将其作为流式处理来执行,因为您不希望将非常大的文件完整地下载到 Lambda。
  • 定义 Glue 过程以去除不需要的字符。这将需要一些自定义编码,因为您的文件不是有效的 json 格式。
  • 使用 CloudShell 下载、修改和上传文件。CloudShell 有 1GB 的存储限制,因此这需要处理少量数据,但不需要您启动 EC2。这是一项新服务,因此此路径可能存在其他问题,但可能是一个有趣的选择。

还有其他可能的选择(EMR),但这些似乎是可能的。我喜欢玩新事物(尤其是当它们免费时),所以如果是我,我会尝试 CloudShell。


推荐阅读