Python
avro
fastavro

fastavroをつかったavroデータの書き込み

BigQueryなどでデータを突っ込むときにavroファイルを作りたい。
avroだと自動スキーマ認識でネストしたテーブルが作れる。

avro(avro-python3)はJava likeなインタフェースなので、Cythonで書かれたfastavroを使いたい

サンプルコード

import fastavro

schema = {
    'name': 'Root',
    'type': 'record',
    'fields': [
        {'name': 'a', 'type': 'string'},
        {
            'name': 'b',
            'type': {
                'type': 'array',
                'items': {
                    'type': 'record',
                    'name': 'B',
                    'namespace': 'root',
                    'fields': [
                        {'name': 'c', 'type': 'string'},
                        {'name': 'd', 'type': ['double', 'null']},
                        {'name': 'e', 'type': ['null', {'type': 'array', 'items': 'int'}]},
                    ],
                },
            },
         },
    ],
}

with open('foobar.avro', 'wb') as out:  # 追記するときは mode='aw'
  writer = fastavro.write.Writer(out, schema, sync_interval=1000, codecs='deflate')

  # loop
  record = {'a': 'aaa', 'b': [{'c': 'ccc', 'd': 123, 'e': [1, 2, 3]}]}
  writer.write(record)

  # 最後にフラッシュしないと最後までデータが書き込まれない(sync_intervalごとに自動flush)
  writer.flush()

あとは、avscファイルやconfig.pyなどにスキーマ定義しておけばよい

参照

BQで対応可能なavroフォーマット
- https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-avro