将 parquet 从 S3 复制到 Redshift 失败:无法访问无效类型:4000

1 python postgresql amazon-web-services amazon-redshift parquet

我现在尝试将所有表从 AWS RDS (PostgreSQL) 加载到 Amazon Redshift。

不过,这里并不那么重要,我使用 Apache Airflow 为我完成所有操作。职位详情如下:

  1. 导出RDS中的所有表,将其转换为parquet文件并上传到S3
  2. 将表的架构从 Pandas Dataframe 提取为 Apache Parquet 格式
  3. 将 S3 中的 Parquet 文件上传到 Redshift

许多周以来,使用 Redshift COPY 命令都可以正常工作,如下所示:

TRUNCATE {table};\n\
COPY {table}\n\
FROM '{s3_key}'\n\
IAM_ROLE '{os.getenv('REDSHIFT_IAM_ROLE')}'\n\
FORMAT AS PARQUET\n\
FILLRECORD\n\
;
Run Code Online (Sandbox Code Playgroud)

然而今天早上发现DAG运行错误,日志是这样的:

Running statement: 
                            TRUNCATE users;
                            COPY users
                            FROM '<s3-bucket-name>'
                            IAM_ROLE '<iam-role>'
                            PARQUET
                            FILLRECORD
                            ;
                        , parameters: None


psycopg2.errors.InternalError_: Assert
DETAIL:  
  -----------------------------------------------
  error:  Assert
  code:      1000
  context:   Unreachable - Invalid type: 4000
  query:     3514431
  location:  dory_util.cpp:528
  process:   padbmaster [pid=4694]
  -----------------------------------------------

Run Code Online (Sandbox Code Playgroud)

我尝试通过运行以下命令在 Redshift 中的上述错误消息中通过查询 id 查找日志:

SELECT * FROM SVL_S3LOG WHERE query = '3514431';
Run Code Online (Sandbox Code Playgroud)

但甚至无法在任何地方找到错误的细节。

已四处搜索并询问 ChatGPT,但我没有找到任何类似的问题或方向,甚至无法找到有关错误日志的更多信息。只发现一些问题说这可能有点 Redshift 内部错误。

但对于 parquet 格式和数据类型来说,转换完全没问题。有人可以指出或给我一些建议来解决我的数据管道问题吗?

小智 7

我和你遇到了同样的问题,我通过以下方式解决了它:

  • 指定列
  • 添加 SERIALIZETOJSON

因此,您的复制查询应如下所示:

COPY users ("col1", "col2", ..., "coln")
FROM '<s3-bucket-name>'
IAM_ROLE '<iam-role>'
FORMAT AS PARQUET SERIALIZETOJSON;
Run Code Online (Sandbox Code Playgroud)

使用这个查询我设法加载数据。