Перечисления Avro, закодированные с помощью Parquet, искажены в UTF-8?

Если я определю простой тип записи в Avro:

{
    "type": "record",
    "name": "Measure",
    "namespace": "parquet.model",
    "fields": [
        {
            "name" : "measure_id",
            "type" : "int"
        },{
            "name" : "measure_name",
            "type" : "string"
        },{
            "name" : "measure_type",
            "type": {
                "type": "enum",
                "name": "MeasureType",
                "symbols" : ["SCALAR", "PROFILE"]
            }
        }
    ]
}

а затем закодировать некоторые данные в формате Parquet, используя эту схему и библиотеку Java parquet-mr, все данные в порядке. Т.е. я могу записать некоторые данные в файл Parquet, а затем прочитать их обратно, и это выглядит идентично.

Но если я читаю файл Parquet с помощью инструментов Parquet, тогда значения перечисления становятся искаженными - SCALAR становится "U0NBTEFS", а PROFILE становится "UFJPRklMRQ==":

> java -jar ~/parquet-tools-1.9.0.jar head measure.parquet

measure_id = 1
measure_name = test1
measure_type = U0NBTEFS

measure_id = 3
measure_name = test2
measure_type = UFJPRklMRQ==

measure_id = 4
measure_name = test3
measure_type = U0NBTEFS

measure_id = 5
measure_name = test4
measure_type = U0NBTEFS

То же самое мы видим в Dremio, когда запрашиваем файл Parquet с помощью SQL. Однако здесь мы можем использовать функцию SQL convert_from:

convert_from(measure_type, 'UTF8')

который затем возвращает нам правильные строки - "SCALAR" и "PROFILE". Таким образом, кажется, что Parquet хранит строки в UTF8, но тогда, похоже, не сможет его разобрать, если вы не преобразуете обратно в модель памяти Avro или явно не конвертируете из UTF8.

Действительно странная вещь, если я использую od -c или же strings в двоичном файле партера я вижу строки "SCALARS" и "PROFILES". Искаженные имена не появляются.

Что здесь происходит?

0 ответов

Другие вопросы по тегам