【问题标题】:Apache Avro: distinguish `double` and `long` in union valuesApache Avro:区分联合值中的“double”和“long”
【发布时间】: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.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 和 implementation/language-neutral 中一样可靠)?

【问题讨论】:

    标签: python json avro


    【解决方案1】:

    在此页面的架构解析部分下:http://avro.apache.org/docs/current/spec.html
    它说:“long 可以提升为 float 或 double
    这就是为什么当你定义为“type”时它起作用的原因:[“double”,“long”,“null”]

    【讨论】:

    • 感谢您的评论,但您指的是阅读器方面的模式解析,即阅读器和编写器分别使用两种不同的模式。我的问题的问题是,当最初写入.avro 文件时,原始值如何与 union 模式中的类型列表匹配。鉴于观察到的结果,avro 似乎使用了 last 匹配类型,这是违反直觉且没有明确记录的。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多