【问题标题】:Loading parquet file to Redshift将镶木地板文件加载到 Redshift
【发布时间】:2023-03-27 22:37:02
【问题描述】:

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

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

【问题讨论】:

  • 你能分享你的数据样本吗?
  • 您使用的是 pyarrow 还是 fastparquet?我推荐 pyarrow
  • 我正在使用 Pyarrow
  • 你确定 Redshift 知道你的 parquet 文件是 gzip 压缩的吗(根据docs 它会知道文件是否有.gz 后缀)?尝试将GZIP 标志添加到COPY 命令。
  • 我认为不可能有 GZIP 标志以及 FORMAT AS PARQUET。我希望红移会自己识别。但是,问题不在于这里,将压缩更改为 None 并没有改变任何内容。

标签: python pandas amazon-redshift parquet fastparquet


【解决方案1】:

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

二进制,整型

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

}

【讨论】:

  • 这可能是问题所在:我的时间戳格式为:可选二进制但 redshift 期望时间戳格式为:2019-12-12 00:20:04 我尝试在 redshift 中切换到 varchar 只是为了测试,问题依旧。如果我做了一个 pd_to_parquet,列类型应该由 pandas 正确处理吧?
  • 对我来说 parquet file ,列是字符串,但红移是时间图,它不起作用。还有其他解决方法吗,比如在复制命令中添加一些其他选项?
【解决方案2】:

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

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

所以

  1. print parquet schema

  2. 获取红移架构

    select *
    from svv_columns
    where table_name = 'table_name'
    

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2018-07-09
    • 2019-12-22
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2021-01-30
    相关资源
    最近更新 更多