Amazon redshift 红移。从S3上的无效JSON复制

Amazon redshift 红移。从S3上的无效JSON复制,amazon-redshift,Amazon Redshift,我正在尝试将数据从S3上的JSON文件加载到红移中 但此文件包含格式错误-行引号“$” ${"id":1,"title":"title 1"}$ ${"id":2,"title":"title 2"}$ 从PostgreSQL导出数据时出错 现在,当我尝试将数据加载到Redshift中时,会收到原始行“$”的消息“Invalid value” 有没有办法使用Redshift

我正在尝试将数据从S3上的JSON文件加载到红移中

但此文件包含格式错误-行引号“$”

${"id":1,"title":"title 1"}$
${"id":2,"title":"title 2"}$
从PostgreSQL导出数据时出错

现在,当我尝试将数据加载到Redshift中时,会收到原始行“$”的消息“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'

提前谢谢

我不认为有一个简单的“忽略这个”选项能在你的情况下起作用。您可以尝试将
NULL设置为“$”
,但我认为这会以不同的方式混淆问题

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

有很多方法可以做到这一点,我希望最好的选择将基于你能迅速做到什么,而不是绝对最好的方式。(听起来这是一次性修复操作。)以下是一些:

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

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

此外,现在我正在考虑如何修改S3上的数据,而不在本地下载文件(根据巨大的数据量),感谢@BillWeiner提供详细的答案!