Redshift UNLOAD后COPY出现乱码:格式解析与解决问询
问题解答
一、数据格式是什么?
你通过UNLOAD命令指定了FORMAT PARQUET,导出的文件是Parquet格式——这是一种二进制列式存储格式,并非纯文本结构,直接以文本方式解析就会显示成你看到的乱码内容。
二、乱码出现的原因
核心问题是导出与导入的格式不匹配:
- UNLOAD生成的是二进制Parquet文件,不是纯文本CSV
- COPY命令指定了
CSV格式,Redshift会把二进制Parquet文件当作纯文本CSV来解析,自然会读出一堆无意义的乱码字符
三、解决办法(含乱码行处理方案)
方案1:修正COPY命令,匹配Parquet格式(推荐)
这是最根本的解决方式,让COPY命令正确识别Parquet格式,无需处理乱码:
COPY core.go_prod_session_backup FROM '<path>' iam_role '<some role>' FORMAT PARQUET;
由于你的UNLOAD命令使用了MANIFEST参数,需要指向manifest文件并添加对应选项:
COPY core.go_prod_session_backup FROM '<path>/manifest' -- 替换为实际manifest文件路径 iam_role '<some role>' FORMAT PARQUET MANIFEST;
方案2:重新导出为CSV格式(若业务需要CSV)
如果场景必须使用CSV格式,修改UNLOAD命令导出CSV后,再用CSV格式执行COPY:
UNLOAD ( 'SELECT es.user_id, NULL::"unknown" AS event_id, es."timestamp" AS es_ts, es.session_id, NULL::"unknown" AS referrer_id FROM es WHERE es."timestamp" < \'2023-08-15 00:00:00\'::timestamp without time zone' ) TO '<some_path>' iam_role '<some role>' FORMAT CSV MANIFEST ALLOWOVERWRITE PARALLEL ON MAXFILESIZE 1024 MB;
方案3:临时跳过乱码行(仅应急,不推荐)
如果必须强行用当前错误格式导入(不建议,会丢失大量有效数据),可通过COPY参数跳过错误行:
MAXERROR <n>:允许最多n条错误行,超过才终止导入IGNOREHEADER <n>:跳过开头n行(若乱码集中在文件头部)
示例命令:
COPY core.go_prod_session_backup FROM '<path>' iam_role '<some role>' CSV MAXERROR 100; -- 允许最多100条错误行
注意:这种方式只是跳过解析失败的行,本质还是错误解析Parquet文件,大部分有效数据会被判定为错误行跳过,仅适合临时应急场景。
内容的提问来源于stack exchange,提问作者Jwan622
相关产品推荐
相关产品推荐

