2012-01-30 79 views
2

我使用import avro等来编译python中的avro模式。有时,我的avro模式将如下所示:当消息包含多条消息时编译avro模式(python)

{ name: "Message1" ..... } 

{ name: "Message2", "fields": [ { "type": "Message1", "name": "previous_avro_schema" } ] } ... 

请忽略拼写错误。我只是想传达信息。要点是我有两个avro模式。其中一个avro模式使用第二个avro模式作为其字段之一。我如何为这样的avro消息调用avro.schema.parse(....)以便它们可以被正确编译?

回答

0

Avro的Python支持很可悲,但您可以一次性获得一些工作,包括多个模式。您只需将模式文件合并到一个文件中,并且您需要确保它们按正确的顺序合并,因此依赖关系首先出现,并且您需要用实际模式替换名称。这是我使用的脚本合并它们:

def resolve(path): 
    "fully resolve a schema that includes other schemas" 
    data = open(path).read() 
    # fill in any while they remain 
    while True: 
     beg = data.find('`') 
     end = data.find('`', beg + 1) 
     if beg < 0: 
      break 
     path = os.path.join(os.path.dirname(path), data[beg+1:end] + '.avsc') 
     data = data[:beg] + resolve(path) + data[end+1:] 
    return data 
+0

感谢您的评论。一个问题: 您的模式是以'''开头而不是'{'?我的模式文件通常以'{'开头并以'}'结尾 – Rajat 2012-01-30 23:30:04

+0

不,我的开头是'{',但是'''在那里,因为那是我如何注入其他模式。 – guidoism 2012-01-30 23:34:12

+1

你能解释为什么/这是如何工作的?合并之前/之后avro/JSON的样子是什么? – sholsapp 2012-07-26 04:13:39