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などにスキーマ定義しておけばよい
参照
- https://avro.apache.org/docs/1.8.2/gettingstartedpython.html
- https://github.com/tebeka/fastavro/blob/master/tests/test_fastavro.py
- http://www.mwsoft.jp/programming/python/python3_avro.html
BQで対応可能なavroフォーマット