使用 v1.11.0 编写时,将 Parquet 数据加载到 Snowflake 云数据库时出现问题

Issue with loading Parquet data into Snowflake Cloud Database when written with v1.11.0

我是 Snowflake 的新手,但我的公司已经成功使用它了。

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

我一直在更新依赖项以便使用最新的 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));
    }
  }
}

我有 2 个文件,用 parquet 1.10.1 和 1.11.0 编写,输出相同的模式。

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

但是,一旦我添加回“地图”类型,我就会在尝试摄取 1.11.0 版本时收到来自 Snowflake 的奇怪错误消息(但是 1.10.1 版本将成功加载)。但是带有 1.11.0、1.10.1 等的 parquet-tools 仍然可以读取文件。

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

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

感谢任何帮助

Logical type Null can not be applied to group node

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

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

new logicalTypes schema metadata introduced in Parquet defines many types including a singular MAP type. Historically, the former convertedTypes schema field supported use of MAP AND MAP_KEY_VALUE for legacy readers. The new writers that use logicalTypes (1.11.0+) should not be using the legacy map type anymore, but work 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 to update their Avro writers to stop nesting the legacy MAP_KEY_VALUE type when transforming an Avro schema to a Parquet one. It should've ideally been done as part of PARQUET-1410.

的错误

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