amazon-redshift - 红移。从 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'
提前致谢!
解决方案
我认为没有一个简单的“忽略此”选项适用于您的情况。您可以尝试NULL AS '$'
,但我希望这只会以不同的方式混淆事物。
最好的办法是过滤文件并用固定版本替换原件。正如您在评论中指出的那样,将它们下载到您的系统中,由于大小的原因,修改和推回并不是一个好的选择。这将影响您的传输速度(通过 Internet)和 S3 的数据输出成本。您想在 AWS 的“内部”执行此操作。
有很多方法可以做到这一点,我希望最佳选择将基于您可以快速完成的操作,而不是绝对的最佳方法。(听起来这是一次修复操作。)这里有一些:
- 启动一个 EC2 实例并对 AWS 内部的这个系统执行下载-修改-上传过程。请记住在您的 VPC 中有一个 S3 终端节点。
- 创建一个 Lambda 函数以将数据流入、修改并推回 S3。只需将其作为流式处理来执行,因为您不希望将非常大的文件完整地下载到 Lambda。
- 定义 Glue 过程以去除不需要的字符。这将需要一些自定义编码,因为您的文件不是有效的 json 格式。
- 使用 CloudShell 下载、修改和上传文件。CloudShell 有 1GB 的存储限制,因此这需要处理少量数据,但不需要您启动 EC2。这是一项新服务,因此此路径可能存在其他问题,但可能是一个有趣的选择。
还有其他可能的选择(EMR),但这些似乎是可能的。我喜欢玩新事物(尤其是当它们免费时),所以如果是我,我会尝试 CloudShell。
推荐阅读
- linux - CSI 摄像头驱动程序不显示 ffplay 的输出
- django - 在 Django 3.2.2 版中更改 DateTimeField 格式
- sql - SQL 帮助以块的形式“透视”表
- java - SPEL:如何从地图中获取多个值并保持格式化
- c++ - 如果模板从未在未评估的上下文之外被调用,是否返回 declval UB?
- date - DAX 如何在范围内填充缺失的日期(报表生成器)
- node.js - ProcessContainerFork.js pm2“意外令牌导入”节点 14
- javascript - 使用反应原生元素创建选项卡
- python - 合并DataFrame中的上下行
- python - 如何使用带有转换器 python 的 3D 列表的标记器?