Apache Avro:在union值中区分`double`和`long`

时间:2015-03-15 16:38:31

标签: python json avro

我创建了以下模式,用于使用Apache Avro(python / 1.7.7)序列化一组(labelvalue)对,

{
    "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.01变为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'}

然后我注意到如果我将模式中的联合定义更改为(doublelong之前),

"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和实现/语言中立的情况下是否可靠)?

1 个答案:

答案 0 :(得分:0)

在此页面的架构解析部分下:http://avro.apache.org/docs/current/spec.html
它说:" long可以浮动或加倍"
这就是为什么它定义为&#34;键入&#34;:[&#34; double&#34;,&#34; long&#34;,&#34; null&#34;] < / p>