如果我在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"]
}
}
]
}
,然后使用此模式和Java parquet-mr库以Parquet格式对一些数据进行编码,数据可以正常往返。即我可以将一些数据写到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
当我们使用SQL查询Parquet文件时,我们在Dremio中看到了同样的事情。但是,这里我们可以使用SQL convert_from函数:
convert_from(measure_type, 'UTF8')
然后返回正确的字符串-“ SCALAR”和“ PROFILE”。因此,似乎Parquet将字符串存储在UTF8中,但是除非您将其转换回Avro内存模型或显式地从UTF8进行转换,否则似乎无法对其进行解密。
真正奇怪的是,如果在二进制镶木文件中使用od -c
或strings
,我会看到“ SCALARS”和“ PROFILES”字符串。杂乱的名字不会出现。
这是怎么回事?