【问题标题】:Issue with loading Parquet data into Snowflake Cloud Database when written with v1.11.0使用 v1.11.0 编写时将 Parquet 数据加载到雪花云数据库的问题
【发布时间】:2020-10-11 17:51:09
【问题描述】:

我是 Snowflake 的新手,但我的公司一直在成功使用它。

Parquet 文件目前正在使用 Java parquet-avro v1.10.1 使用现有的 Avro Schema 编写。

为了使用最新的 Avro,我一直在更新依赖项,其中一部分将 Parquet 升级到 1.11.0。

Avro 架构未更改。但是,当使用 COPY INTO Snowflake 命令时,我收到 LOAD FAILED 错误:Error parsing the parquet file: Logical type Null can not be applied to group node 但没有其他错误详细信息 :(

问题是文件中没有空列。

我已经削减了 Avro 架构,发现 Avro 架构中存在 MAP 类型会导致问题。

字段是

    {
      "name": "FeatureAmounts",
      "type": {
        "type": "map",
        "values": "records.MoneyDecimal"
      }
    }

使用 parquet-tools 的 Parquet 模式示例。

message record.ResponseRecord {
  required binary GroupId (STRING);
  required int64 EntryTime (TIMESTAMP(MILLIS,true));
  required int64 HandlingDuration;
  required binary Id (STRING);
  optional binary ResponseId (STRING);
  required binary RequestId (STRING);
  optional fixed_len_byte_array(12) CostInUSD (DECIMAL(28,15));
  required group FeatureAmounts (MAP) {
    repeated group map (MAP_KEY_VALUE) {
      required binary key (STRING);
      required fixed_len_byte_array(12) value (DECIMAL(28,15));
    }
  }
}

我用 parquet 1.10.1 和 1.11.0 编写的 2 个文件输出了相同的架构。

我还尝试了一个更大的架构示例,如果架构中不存在“map”avro 类型,似乎一切正常。我还有其他具有庞大架构的海量文件,许多联合类型转换为镶木地板中的组,但是当它们不包含任何“地图”类型时,它们都可以成功写入和读取。

但是,当我重新添加“地图”类型时,我会在尝试摄取 1.11.0 版本时从 Snowflake 收到奇怪的错误消息(但是 1.10.1 版本会成功加载)。但是 1.11.0、1.10.1 等的 parquet-tools 仍然可以读取文件。

我从comment 了解到 Parquet 1.11.0 中的逻辑类型发生了变化,但它应该仍然兼容旧版本。

但是有谁知道 Snowflake 使用什么版本的 Parquet 来解析这些文件?这里还有其他可能发生的事情吗?

感谢任何帮助

【问题讨论】:

    标签: avro parquet snowflake-cloud-data-platform


    【解决方案1】:

    逻辑类型Null不能应用于组节点

    查看上面的错误,似乎正在使用Apache Arrow's parquet libraries 的版本来读取文件。

    然而,仔细观察,真正的问题在于Avro based Parquet Writer implementation 中使用旧类型(以下假设使用 Java 编写文件)。

    new logicalTypes 架构元数据introduced in Parquet 定义了许多类型,包括singular MAP type。从历史上看,以前的 convertedTypes 架构字段 supported use of MAP AND MAP_KEY_VALUE 用于旧版读者。使用 logicalTypes (1.11.0+) should not be using the legacy map type anymore,但工作 hasn't been done 的新编写器尚未更新 Avro 到 Parquet 模式的转换以完全删除 MAP_KEY_VALUE 类型。

    因此,MAP_KEY_VALUE 的架构字段被写入了 UNKNOWNlogicalType,这会导致 Arrow 的 only understands logicalType values of MAP and LIST (understandably) 实现出错。

    考虑将此记录为针对 Apache Parquet project 的错误,以更新其 Avro 编写器以在将 Avro 模式转换为 Parquet 模式时停止嵌套旧的 MAP_KEY_VALUE 类型。理想情况下,它应该作为PARQUET-1410 的一部分完成。

    不幸的是,这是硬编码的行为,并且没有影响地图类型的配置选项可以帮助为 Apache Arrow(以及通过扩展名用于 Snowflake)生成正确的文件。在 Apache Parquet 开发人员发布适当的修复程序之前,您需要使用较旧版本的编写器。

    【讨论】:

    • 非常感谢您的反馈。我刚刚提出了PARQUET-1879,同时我会尝试自己在 Parquet 中查看这个问题,因为目前坚持使用老作家意味着无法升级其他库....只需要阅读首先是新的逻辑类型 :)
    • 这已在 Parquet 1.11.1 中修复
    猜你喜欢
    • 2021-11-24
    • 2021-09-03
    • 2021-04-12
    • 2017-06-09
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多