Redshift COPY导入BigQuery数据遇JSON超4MB限制的解决办法咨询
解决Redshift COPY JSON单行超4MB限制的实用方案
兄弟,这个问题我之前帮不少开发者处理过,Redshift默认对单个JSON对象的大小限制是4MB,这就是你触发错误的原因。下面给你几个可行的规避办法,按推荐程度排序:
1. 改用Parquet格式导入(首推)
BigQuery支持直接把数据导出为Parquet格式,而Redshift对Parquet的导入没有单行大小限制,而且Parquet作为列存格式,导入速度和存储效率都比JSON高一大截。操作步骤很简单:
- 从BigQuery重新导出数据到S3,选择Parquet格式;
- 把你的COPY命令改成Parquet版本:
COPY events_20180627 FROM 's3://big-query-to-rs/big-query-data/events_20180627.parquet' CREDENTIALS 'aws_access_key_id=XXXXXXXXX;aws_secret_access_key=XXXXXXXXXXX' FORMAT AS PARQUET;
2. 拆分大JSON对象为多行小记录
如果必须保留JSON格式,那得先处理S3上的大文件,把单个超大的JSON对象拆成多个符合大小限制的小对象(每行一个JSON对象)。你可以用AWS Lambda自动化这个流程:
- 写个Lambda函数,读取S3上的大JSON文件,把大对象里的嵌套数组拆成单独的记录,或者按字段拆分出多个小对象;
- 把处理后的文件存回S3的新路径;
- 再用你原来的COPY命令导入处理后的文件就行。
3. 用Redshift Spectrum中转导入
要是不想动源文件,还可以用Redshift Spectrum先挂载S3上的JSON数据,再通过INSERT把数据同步到Redshift表。Spectrum对JSON对象的大小限制比直接COPY宽松很多:
- 先创建外部Schema和外部表,指向S3上的JSON数据;
- 执行INSERT语句把外部表的数据导入目标表:
INSERT INTO events_20180627 SELECT * FROM external_schema.external_events_20180627;
4. 修改Redshift配置(不推荐)
Redshift有个json_max_size参数可以调整单行JSON的最大限制,但这个参数需要重启集群,而且最大只能设到16MB——如果你的行比16MB还大,这个方法就失效了,所以除非万不得已,不建议用这个办法。
内容的提问来源于stack exchange,提问作者iamabhaykmr
相关产品推荐
相关产品推荐

