Перечисления 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". Искаженные имена не появляются.
Что здесь происходит?