apache / apache/parquet-java

parquet-cli unable to read UUID values

Đang mở
#1,641 13 bình luận 0 reaction 0 người được giao Xem trên GitHub
Component: CLI Component: Parquet Priority: Minor Type: bug
Ngôn ngữ chính
Java
Star
3.1k
Fork
1.6k
Merge trung bình
3 ngày 12 giờ
Pull request đã merge (30 ngày)
33

Mô tả

I am finding that parquet-cli throws when trying to read UUID values. 

Attached to this bug report is a parquet file with 2 columns, message encoded as byte-array and number encoded as fixed length byte array (UUID). This file was written by my .net implementation of parquet specification. The file has one row worth of data and is readable by parquet-cpp.

Schema as read by parquet-cli:

message root

{   required binary Message (STRING);   required fixed_len_byte_array(16) Number (UUID); }

Values as read by parquet-cpp:

— Values —
Message                       |Number                        |
First record                  |215 48 212 219 218 57 169 67 166 116 7 79 44 227 50 17 |

 

Here is the exception stack from parquet-cli when trying to read uuid values:
```java

Caused by: org.apache.parquet.io.ParquetDecodingException: The requested schema is not compatible with the file schema. incompatible types: required binary Number (STRING) != required fixed_len_byte_array(16) Number (UUID)
        at org.apache.parquet.io.ColumnIOFactory$ColumnIOCreatorVisitor.incompatibleSchema(ColumnIOFactory.java:101)
        at org.apache.parquet.io.ColumnIOFactory$ColumnIOCreatorVisitor.visit(ColumnIOFactory.java:93)
        at org.apache.parquet.schema.PrimitiveType.accept(PrimitiveType.java:602)
        at org.apache.parquet.io.ColumnIOFactory$ColumnIOCreatorVisitor.visitChildren(ColumnIOFactory.java:83)
        at org.apache.parquet.io.ColumnIOFactory$ColumnIOCreatorVisitor.visit(ColumnIOFactory.java:57)
        at org.apache.parquet.schema.MessageType.accept(MessageType.java:55)
        at org.apache.parquet.io.ColumnIOFactory.getColumnIO(ColumnIOFactory.java:162)
        at org.apache.parquet.hadoop.InternalParquetRecordReader.checkRead(InternalParquetRecordReader.java:135)
        at org.apache.parquet.hadoop.InternalParquetRecordReader.nextKeyValue(InternalParquetRecordReader.java:225)

```
 I debugged parquet-cli code and found that parquet-cli is trying to project the UUID as a string and later on that throws as these types are not compatible? 

 

Source code references:

At AvroReadSupport.java, line 97

~~~~~~~~~~~~

    String requestedProjectionString = configuration.get(AVRO_REQUESTED_PROJECTION);

    if (requestedProjectionString != null)

{       Schema avroRequestedProjection = new Schema.Parser().parse(requestedProjectionString);       projection = new AvroSchemaConverter(configuration).convert(avroRequestedProjection);     }

~~~~~~~~~~~~

 

Debugger values for

requestedProjectionString=

{"type":"record","name":"root","fields":[
{"name":"Message","type":"string"}

,\{"name":"Number","type":{"type":"string","logicalType":"uuid"}}]}

[Note that `Number` now has a type of `string` and a logicalType of `uuid`]

 

At ColumnIOFactory.java line 93

~~~~~~~~~~~~

incompatibleSchema(primitiveType, currentRequestedType);

~~~~~~~~~~~~

Debugger values for 

primitiveType = required fixed_len_byte_array(16) Number (UUID)

currentRequestedType = required binary Number (STRING)

 

and this will throw.

 

If I skip over the projection code in AvroReadSupport, parquet-cli is able to read my file.

I am not sure if the bug is in parquet-cli or parquet-mr or in the library I used to encode this file. The fact that parquet-cpp is able to read it gives me some confidence to say that the problem is either in parquet-cli or parquet-mr.

Please point me in the right direction if I could verify this UUID roundtripping purely from parquet-mr itself in form of an unit-test. Happy to contribute tests or fix if needed.

**Reporter**: [Balaji K](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=gamaken)
#### Original Issue Attachments:
- [guid.parquet](https://issues.apache.org/jira/secure/attachment/13042816/guid.parquet)

**Note**: *This issue was originally created as [PARQUET-2140](https://issues.apache.org/jira/browse/PARQUET-2140). Please see the [migration documentation](https://issues.apache.org/jira/browse/PARQUET-2502) for further details.*

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu với AvroReadSupport.java ở phần chuyển đổi projection được yêu cầu và ColumnIOFactory.java ở phần kiểm tra schema không tương thích. Tái hiện lỗi bằng tệp guid.parquet đính kèm hoặc một unit test parquet-mr sử dụng schema UUID được nêu trong báo cáo. Được xem là hoàn thành khi parquet-cli hoặc read path parquet-mr liên quan có thể đọc UUID fixed_len_byte_array mà không gặp exception do schema không tương thích.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java
Lĩnh vực
data-engineering
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
45/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.