先日業務でBigqueryにCSVをインポートして新規のテーブルを作成しようとしたのですが、手作業で作ったcsvだからインポートの際に予期せぬエラーに遭遇し結構時間を食ったので解決法とかをメモしておきます。
基本的なインポート手順は↓
Google Bigqueryでのテーブル作成方法(CSVインポート)※2022/2改訂版 – Qiita
エラー内容
Error while reading data, error message: Error detected while parsing row starting at position: 3075707512. Error: Missing close double quote (“) character.
エラー分だけ見ると、クオテーション(’)がちゃんと囲まれていないという内容でしたが元データのcsvを見てもそれらしい部分がなく意味不明という状態・・・
解決法(bqコマンドでテーブル作成)
SDKのBQコマンド経由でアップロードする際にコマンド引数の設定を加えると解決するみたいです。
まずテーブルの元になるcsvをcloudstrogeのバケットにアップロードします、そしてそれをローカルなりからBQコマンドを叩く、という要領です。
余談ですが、Cloud Shell | Google Cloud というサービスを利用することでローカルにGCPのSDKをインストールせずともBQコマンドを実行できます。
bigqueryへのテーブル作成orデータの挿入は$ bq loadというコマンドで実行できます。その際にコマンド引数「–allow_quoted_newlines」を加えてあげることで解決しました
# コマンド経由でcsvから新規テーブルを作成する $ bq load --skip_leading_rows=1 --allow_quoted_newlines --ignore_unknown_values --replace --sync --source_format=CSV --autodetect xxxx.tablename gs://バケット名/csvファイル名
重要な引数を一部解説すると「–autodetect」はテーブル作成の際のテーブルのスキーマを自動認識して生成する設定です。–autodetectではなくかつスキーマデータがない場合は「No schema specified on job or table.」というエラーになるので注意してください
またbigquery csv import 「autodetect Unable to parse」というエラーが出た場合はデータの中に紛らわしい形式のものや異常値があり自動認識に失敗しているので、エラーの出ている列のデータを見つけられて修正できる場合は手動やPythonでうまく直すか、それが難しい場合はスキーマファイルを設定してあげる必要があります。
スキーマファイルの設定について以下参照↓
Loading CSV data from Cloud Storage | BigQuery | Google Cloud
参考:https://qiita.com/sawanoboly/items/410b3346518e569da581
コメント