0

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

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 应用相同的程序,它工作得很好。切换到镶木地板时出现问题的原因是什么?

4

2 回答 2

2

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

您需要将您的表架构与镶木地板架构并排进行比较 - 这应该会给您一个答案。

所以

  1. 打印镶木地板模式

  2. 获取红移模式

    select *
    from svv_columns
    where table_name = 'table_name'
    
于 2019-12-20T06:00:51.753 回答
1

如上所述,您需要确保 parquet 和 redshift 之间的数据类型匹配。当 redshift 尝试从 parquet 文件中复制数据时,它会严格检查类型。Parquet 使用原始类型

二进制,int类型

如果您看到下面的示例,在 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;

}
于 2019-12-20T16:23:01.403 回答