【发布时间】:2015-05-17 18:21:16
【问题描述】:
我创建了以下架构,用于使用 Apache Avro (python/1.7.7) 序列化一组 (label, value) 对,
{
"type": "record",
"name": "Measurement",
"fields": [
{
"name": "label",
"type": "string"
},
{
"name": "value",
"type": [ "long", "double", "null" ]
}
]
}
用于写入数据的python 脚本看起来像,
from avro.datafile import DataFileWriter
from avro.io import DatumWriter
writer = DataFileWriter(open("data.avro", "w"), DatumWriter(), schema)
writer.append({"label": "A", "value": 0})
writer.append({"label": "B", "value": 0.5})
writer.append({"label": "C", "value": 1})
writer.append({"label": "D", "value": None})
writer.close()
读者对应的看起来像,
from avro.datafile import DataFileReader
from avro.io import DatumReader
reader = DataFileReader(open("data.avro", "r"), DatumReader())
for record in reader:
print(record)
reader.close()
令人惊讶的是,当从阅读器端恢复时,int 值不知何故变成了float(即0 变成了0.0 和1 变成了1.0),
{u'value': 0.0, u'label': u'A'}
{u'value': 0.5, u'label': u'B'}
{u'value': 1.0, u'label': u'C'}
{u'value': None, u'label': u'D'}
然后我注意到,如果我将架构中的联合定义更改为(即double 在long 之前),
"type": [ "double", "long", "null"]
那么联合值的类型会在阅读器端正确恢复,即
{u'value': 0, u'label': u'A'}
{u'value': 0.5, u'label': u'B'}
{u'value': 1, u'label': u'C'}
{u'value': None, u'label': u'D'}
现在的问题是,这是保留 Avro 联合值类型的可靠方法(即,在 specified 和 implementation/language-neutral 中一样可靠)?
【问题讨论】: