BigQueryにJSONファイルをローカル環境のコマンドラインからアップロードする

#はじめに
BigQueryにデータを送る方法として「実行環境：ローカルファイル」「データ形式：JSON」「実行ツール：コマンドライン」の組み合わせを実施する。

- 送信元のパターン
    - [**ローカルファイル**](https://cloud.google.com/bigquery/docs/loading-data-local) ← コレ
    - [Cloud Storage](https://cloud.google.com/bigquery/docs/loading-data-cloud-storage)
    - [ストリーミング](https://cloud.google.com/bigquery/streaming-data-into-bigquery#bigquery_table_insert_rows-python)
- データ形式のパターン
    - **JSON** ← コレ
    - CSV
    - その他
- 実行ツールのパターン
    - **コマンドライン** ← コレ
    - スクリプト
    - BigQueryのUI(コンソール画面) ...テーブルの新規作成時のみ可

#STEP1: 送信するレコードとそのスキーマのデータをJSONファイルで作成
レコードのJSONの形式は特殊で、「行単位で完結している JSON ファイル[参考記事1]」。

```sample-records.json
{"sample_column_1":"masato", "sample_column_2":1}
{"sample_column_1":"tarou", "sample_column_2":2}
{"sample_column_1":"marou", "sample_column_2":3}
```
```sample-schema.json
[
  {
    "name": "sample_column_1",
    "type": "STRING"
  },
  {
    "name": "sample_column_2",
    "type": "INTEGER"
  }
]
```

#STEP2: SDKインストール
SDKをインストールすることで、指定されたコマンドを入力すれば対応する操作がGoogleクラウド上で可能になる([公式ドキュメント](https://cloud.google.com/sdk/docs/downloads-interactive))。

#STEP3: BigQueryのデータセットの作成
<img width="453" alt="bigquery-project-and-dataset-sample-image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/5661b9e7-545e-f8d5-d2ab-1bd46390c7a7.png">
※コンソール画面のほうが分かりやすいが、コマンドラインを使うなら[公式ドキュメント](https://cloud.google.com/bigquery/docs/datasets?hl=ja)を参照

#STEP4: SDKのプロジェクトを指定する
送信したいBigqueryのデータセットがあるプロジェクトが、現在SDKで設定しているプロジェクトと異なる場合、送信先が見つからないためエラーになる。したがって、以下SDKのコマンドで現在のプロジェクトを指定する([公式ドキュメント](https://cloud.google.com/sdk/gcloud/reference/config/set#EXAMPLES))
`$ gcloud config set project myProject`


#STEP5: 送信先と送信データを指定してSDKでコマンドを実行する
`$ bq load --source_format=NEWLINE_DELIMITED_JSON sample-dataset.sample_table sample-records.json sample-records.json`
([公式ドキュメント](https://cloud.google.com/bigquery/docs/loading-data-local?hl=ja))
<img width="368" alt="bigquery-project-and-dataset-sample-result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/37375cc8-c120-7c2a-a476-27e3fa422c76.png">
行1~3は新規追加したときのレコードであり、このときテーブルも作成された。同じコマンドを再度実行してテーブルに追加されたレコードが行4~6。つまりテーブルの作成とテーブルへのデータ追加どちらにも対応したコマンドと言える。
※[参考記事1]で紹介されているのを見て`load`コマンドを`insert`に変えたところ、こちらでもデータを登録することができた。ただし、相違点を現段階で詳しく調べてはいない。

#参考
[1] [BigQuery でデータ追加が意外と難しかったのでメモ - @ta_ta_ta_miya](https://qiita.com/ta_ta_ta_miya/items/6d262b9455d502328127)
[2] [Google BigQuery の JSON投入を軽く試す - isdyy/google-bigquery-json.md](https://gist.github.com/isdyy/5072792)

#背景
↓をJSONでやってみようかと思って。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">暇だからマッチングアプリで自動イイねし続けるプログラムを作ってみた。これだけじゃつまらんけど今後テキストマイニングと画像解析でイイね対象の人の最適化していくのが楽しみ。その前に教師データとして属性・文章・画像URLデータをBigQuery(後でStrageも)に溜めたいところだが費用が気になる... <a href="https://t.co/KALuWK4qOG">pic.twitter.com/KALuWK4qOG</a></p>&mdash; なんせすてく (@masatoemata) <a href="https://twitter.com/masatoemata/status/1243875421055094784?ref_src=twsrc%5Etfw">March 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

何かあればお手数ですが、本記事か以下アカウントでお知らせください

**[*Qiitaアカウント*](https://qiita.com/MasatoEmata)**
**[*Twitterアカウント*](https://twitter.com/masatoemata)**