我创建了以下模式,用于使用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和实现/语言中立的情况下是否可靠)?
答案 0 :(得分:0)
在此页面的架构解析部分下:http://avro.apache.org/docs/current/spec.html
它说:" long可以浮动或加倍"
这就是为什么它定义为&#34;键入&#34;:[&#34; double&#34;,&#34; long&#34;,&#34; null&#34;] < / p>