将镶木地板文件加载到Redshift

时间:2019-12-19 13:44:16

标签: python pandas amazon-redshift parquet fastparquet

我正在尝试将数据帧保存到拼花地板,然后将它们加载到redshift中。 为此,我执行以下操作:

parquet_buffer = BytesIO()
df.to_parquet(parquet_buffer,index=False,compression='gzip')
s3.Bucket(write_bucket).put_object(Key=write_path,Body=parquet_buffer.getvalue())

然后我使用“ COPY”命令将保存的文件直接加载到redshift中:

COPY table_name
from write_path
iam_role my_iam_role
FORMAT AS PARQUET

它导致以下错误: write path: has an incompatible Parquet schema for column ...

如果我对.csv应用相同的过程,则效果很好。切换到镶木地板时是什么引起问题?

2 个答案:

答案 0 :(得分:1)

如果是架构不兼容的问题-列名或类型有一些差异

您需要并排比较表模式和实木复合地板模式-这应该给您一个答案。

所以

  1. print parquet schema

  2. 获取redshift模式

    select *
    from svv_columns
    where table_name = 'table_name'
    

答案 1 :(得分:1)

如上所述,您需要确保镶木地板和redshift之间的数据类型匹配。当redshift试图从镶木地板文件中复制数据时,它将严格检查类型。实木复合地板使用原始类型

  

二进制,整数类型

如果您看到以下示例,则在Parquet中将日期存储为int32,将时间戳存储为int96。确保它们是redshift中的日期类型和时间戳类型。

parquet-tools schema 20191217_175027_00001_krvcf_0552e0f1-5e05-4cb1-ae88-fe70ce5b91b5



message hive_schema {
  optional int32 operating_day (DATE);
  optional binary asset_id (UTF8);
  optional binary account_id (UTF8);
  optional int96 found_time;
  optional int96 trutst_time;

}