1. 程式人生 > >Avro 資料格式和命令列

Avro 資料格式和命令列

  • 支援的原始型別:null,boolean,int,long,float,double,bytes,string
  • 支援的複雜型別:

    • records

      • 必須:"type":"record"
      • 必須:"name":"記錄名"
      • "namespace":"包名"
      • "doc":"為schema提供文件"
      • "aliases":"json的一個string陣列,為這條記錄提供別名"
      • 必須:"fields":"json陣列,列舉所有屬性,每個fields都是一個json物件幷包含如下屬性"

        • 必須:"name":"屬性名"
        • 必須:"type":"屬性型別"
        • "doc":"屬性文件"
        • "order":"預設升序"
        • "default":"屬性預設值"

      markdown_img_paste_20181103110442275

- 案例
  {
    "namespace": "example.avro",
    "type": "record",
    "name": "User",
    "fields": [
         {"name": "name", "type": "string"},
         {"name": "favorite_number",  "type": ["int", "null"]},
         {"name": "favorite_color", "type": ["string", "null"]}
    ]
  }
  • enums

    • 必須:"type":"enum"
    • 必須:"name":"enum名"
    • "namespace":"限定和修飾name屬性,包名"
    • 必須:"symbols":"string陣列,列舉所有列舉"
    • "aliases":"string陣列,為enum提供別名"
    • "doc":"為此schema提供文件"
    {
        "type": "enum",
        "name": "Suit",
        "symbols": [
            "SPADES",
            "HEARTS",
            "DIAMONDS",
            "CLUBS"
        ]
    }
  • arrays

    • 必須:"items":"array中元素的Schema"
    {
      "type": "record",
      "name": "ArrAvro",
      "fields" : [
        {"name": "arr", "type": ["null",{"type":"array", "items":"string"}]}
      ]
    }
    編譯後是:  @Deprecated public java.util.List<java.lang.CharSequence> arr;
  • maps

    • 必須:"values":"定義map的值的Schema,Maps的key都是string"
    • Map定義為
    {
        "type": "record",
        "name": "MapAvro",
        "fields": [
            {
                "name": "map",
                "type": [
                    "null",
                    {
                        "type": "map",
                        "values": "long"
                    }
                ]
            }
        ]
    }
    編譯後:  @Deprecated public java.util.Map<java.lang.CharSequence,java.lang.Long> map
  • unions

    • Unions就像JSON的陣列表示:["string", "null"],聲明瞭一個union的Schema,其元素即可以是string,也可以是null。
    • Unions不能包含多個相同型別的Schema,除非是命名的record型別、命名的fixed型別和命名的enum型別。比如,如果unions中包含兩個array型別,或者包含兩個map型別都不允許;但是兩個具有不同name的相同型別卻可以。由此可見,union是通過Schema的name來區分元素Schema的,因為array和map沒有name屬性,當然只能存在一個array或者map。(使用name作為解析的原因是這樣做會使得讀寫unions更加高效)。unions不能緊接著包含其他的union。
    • 組合型別,表示各種型別的組合,使用陣列進行組合。比如[“null”, “string”]表示型別可以為null或者string。
    • 組合型別的預設值是看組合型別的第一個元素,因此如果一個組合型別包括null型別,那麼null型別一般都會放在第一個位置,這樣子的話這個組合型別的預設值就是null。
    • 組合型別中不允許同一種類型的元素的個數不會超過1個,除了record,fixed和enum。比如組合類中有2個array型別或者2個map型別,這是不允許的。
    • 組合型別不允許巢狀組合型別。
  • fixed.

    • 必須:"name":"名字"
    • "namespace":"包名"
    • "aliases":"別名"
    • 必須:"size":"一個整數,表示每個值的位元組數"
    • 比如16位元組的fixed可以宣告為:{"type": "fixed", "size": 16, "name": "md5"}
  • avro命令

    • 使用avro工具將json檔案轉換成avro檔案:java -jar avro-tools-1.8.0.jar fromjson --schema-file user.avsc user.json > user.avro
    • 可以設定壓縮格式:java -jar avro-tools-1.8.0.jar fromjson --codec snappy --schema-file user.avsc user.json > user2.avro
    • 將avro檔案反轉換成json檔案:
    java -jar avro-tools-1.8.0.jar tojson user.avro
    java -jar avro-tools-1.8.0.jar --pretty tojson user.avro
    • 得到avro檔案的meta:java -jar avro-tools-1.8.0.jar getmeta user.avro

      • 輸出:
      avro.codec    null
      avro.schema    {"type":"record","name":"User","namespace":"example.avro","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":"int"},{"name":"favorite_color","type":"string"}]}
    • 得到avro檔案的schema:java -jar avro-tools-1.8.0.jar getschema user.avro
    • 將文字檔案轉換成avro檔案:java -jar avro-tools-1.8.0.jar fromtext user.txt usertxt.avro