apache / apache/parquet-java

Breaking change in Avro 1.12.1 affects parquet-avro users: logical types now deserialize to different Java types

オープン
#3,515 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Java
スター
3.1k
フォーク
1.6k
平均マージ
3日 12時間
マージ済み PR(30日)
33

説明

## Summary

Avro 1.12.1 introduces a breaking change that affects `parquet-avro` users. Multiple logical types are now deserialized to their proper Java types instead of their underlying primitive types when using `ReflectData`, causing `ClassCastException` in existing code.

## Background

- **Upstream issue:** https://issues.apache.org/jira/browse/AVRO-3989
- **Pull request:** https://github.com/apache/avro/pull/3354
- **Avro version affected:** 1.12.1 (released as a patch version)

## Problem

The fix in AVRO-3989 changed the deserialization behavior for ALL logical types. When using within parquet-avro `ReflectData` or `SpecificData` classes, these fields now return their logical Java type objects instead of their underlying primitive types from `GenericRecord`.

### Affected logical types and conversions:

| Logical Type | Old Type (≤1.12.0) | New Type (1.12.1) |
|--------------|-------------------|-------------------|
| `timestamp-millis` | `Long` | `Instant` |
| `timestamp-micros` | `Long` | `Instant` |
| `date` | `Integer` | `LocalDate` |
| `time-millis` | `Integer` | `LocalTime` |
| `time-micros` | `Long` | `LocalTime` |
| `local-timestamp-millis` | `Long` | `LocalDateTime` |
| `local-timestamp-micros` | `Long` | `LocalDateTime` |
| `uuid` | `String` | `UUID` |
| `decimal` | `ByteBuffer` | `BigDecimal` |

This breaks existing code that expects primitive values:

```java
// This used to work in Avro 1.12.0
Long timestamp = (Long) genericRecord.get("timestamp_field");
Integer date = (Integer) genericRecord.get("date_field");
String uuid = (String) genericRecord.get("uuid_field");

// In Avro 1.12.1, all of these throw ClassCastException
// because values are now Instant, LocalDate, UUID, etc.
```

## Impact

- **Widespread breakage:** Affects anyone using parquet-avro with ANY logical types
- Code that has worked for years suddenly breaks after a patch version update
- The breaking nature wasn't clearly documented in Avro's changelog
- This is a significant behavior change that affects the entire logical type system

## Heads up for future avro updates

I apologize if this isn't the right place to report this, please feel free to redirect me if there's a better venue for this discussion. My main goal is to ensure that when parquet-java does consider updating Avro, the team and users are aware of this significant behavioral change.

## For Current Users

If you're using parquet-avro and explicitly upgrading Avro to 1.12.1+ in your project, be aware of this breaking change. You'll need to update code that reads logical type fields from `GenericRecord`.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Issue の AVRO-3989 リンクと、ここで説明されている ReflectData、SpecificData、GenericRecord の動作から始めてください。parquet-java のファイルやテストは指定されていません。Avro 1.12.0 と 1.12.1 で、列挙された論理型の扱いを比較し、その後、完了の定義を決める前に、どのような変更またはドキュメントが期待されているかを maintainers と確認してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
data-engineering
issue の種類
バグ
難易度
5/5
見積もり時間
1週間以上
活発さ
静か
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。