環境
- Google Cloud Composer (Airflow 1.10.2-composer)
背景
GoogleCloudStorageToBigQueryOperator を使った csv ファイルを Bigquery にロードする処理で、下記のエラーが発生しました。
「Error while reading data, error message: Error detected while parsing row starting at position: XXX. Error: Bad character (ASCII 0) encountered.」
回避策
調べたところ、取込 csv ファイルに「ヌル文字 - Wikipedia」が混入しました。
さらに、こちらのEmbulk でASCII 0 encountered エラーの回避方法 に回避策を教えていただきました。
さて、BashOperator を使いましょう。
rm_null_char = BashOperator(
task_id='rm_null_char',
bash_command='./rm_null_char.sh',
params={"src_file": "gs://src_file.csv", "fixed_file": "gs://fixed_file.csv"},
dag=dag,
)
#!/bin/bash
gsutil cp {{ params.src_file }} - | tr -d '\000' | gsutil cp - {{ params.fixed_file }}
シェルスクリプトに書いてあるコマンドは bash_command に直に書くことも試しましたが、「\000」は Airflow に解析されて、「tr -d ''」となり、何も変更しないことになりました。
懸念点
まだ検証、勉強不足のところがありますが、
上記のコマンドはメモリ上で動いている気がします。
大量データの csv ファイルを処理する時に、他のタスクに影響が出そう、、
あと、ヌル文字混入したのところを解決するのが根本策ですが、
csv ファイルはお客さんが提供しているものなので、回避策までにしました。