2012-01-30 73 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