通过Parquet编码的Avro枚举是否被UTF-8修饰?

时间:2019-07-19 09:59:35

标签: utf-8 avro parquet parquet-mr dremio

如果我在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 -cstrings,我会看到“ SCALARS”和“ PROFILES”字符串。杂乱的名字不会出现。

这是怎么回事?

0 个答案:

没有答案