【BigQuery】Google Cloud Platform（GCP）でバケットを作成し、データをアップロードして、BigQueryで読み込み、SQL実行してテーブル作成する方法だおｗ

#概要
**<font color="LightSeaGreen">
全ての人間は２種類に分けることができる。
　　　　　　　　Google Cloud Platformでバケット作成とかわちゃわちゃいじれる者と、そうでない者。
　　　　　　　　　　　　　　　　　　　　@74kenshiro（1988～2130年）</font>**

**名もなき初心者エンジニアがGoogle Cloud Platform でバケット作成してBigQueryで読み込んだりするだけの記事だお。**


**目次**
**１．バケットを作成する
２．バケットにデータをアップロードする
３．アップロードしたデータをBigQueryで読み込む（テーブルの作成）
４．SQL実行した出力結果をテーブルとして保存する**
#この記事で分かること##
**・バケットの作成方法
・バケットへのアップロード方法
・バケットのデータをBigQueryで読み込む方法
・出力結果をテーブルに保存する方法とその際の注意点**

#データ概要
**元データ：とある会社の社員データ「staff_list.csv」**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/03571602-9167-d39b-19ff-09110aaf1d23.png)


#１．バケットを作成する
###①Google Cloud Platform（以下ＧＣＰ）の画面左のメニューで「Storage」➡「ブラウザ」➡「バケットを作成」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/e8f641ac-3553-25f5-a60a-a811b2085f7d.png)

###２．バケットの名前を入力し、各項目を選択、作成をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/6b353398-d6cd-74a4-e98a-b33febe84ab6.png)

##２．バケットにデータをアップロードする。
###１．バケットを選択して対象をクリックする。　ドラッグでもいける！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/4d3d555a-af6b-a5bf-8b36-df24befb3b56.png)




#３．アップロードしたデータをBigQueryで読み込む（テーブルの作成）
**今回は新たにデータセットを作成します。**
##１．データセットの作成
###①．プロジェクトを選択し、「データセットを作成」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/73ad745c-31fe-e7ab-1386-1df685af7eb9.png)
###②データセット名を入力、ロケーション、有効期限を指定し、「データセットを作成をクリック」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/53c0465b-40ce-f5b5-c11b-90a8b050f221.png)
###③プロジェクトに内蔵されているか確認。あればおｋ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/de777998-65b5-8ecf-3e10-f6a9bacd877e.png)
##２．CSVデータを読込み、テーブルを作成する
###①データセットを選択し、「テーブルを作成」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/fc760f0d-1401-041b-004a-a9d7bf8aeb34.png)

###②「テーブルの作成元」をクリックし、「Google Cloud Storage」を選択、「参照」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/818032c1-81fa-1745-0067-7ef1c8ef38d0.png)
###③対象のバケットをダブルクリック、ファイルを選択し、「選択」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/25c2e42e-2fd8-9765-7f80-15bb58e5f8b1.png)
###④ファイル形式（今回はCSV）を選択、テーブル名を入力しテーブルを作成
スキーマ自動検出とは、カラムとデータ型を自動で検出してくれる機能。
カラムが英字でデータ型に指定が無い場合はチェック。
元データにカラム（ヘッダー）がある場合は、「詳細オプション」をクリックし、「スキップするヘッダー行」を指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/72e0686c-a8c3-f1f5-de07-4ac73df192d4.png)

ちなみに、**CSVの文字エンコードはUTF-8でないと日本語が文字化けする。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/a75cc8ed-fb0d-4f83-2a83-21bd274bdd5c.png)

UTF-8だとしても、**BigQueryはカラム日本語非対応**なので、修正しないといけない。アッチャー！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/52ad4ed1-b6b1-7225-0851-e11aa8d0aec0.png)

元データのカラム名（ヘッダー）が修正出来るなら、英字に変換しておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/53b0f69a-7f2a-28f1-0a95-6d5ff2b9d562.png)
そしてＵＴＦ８で保存する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/d57ca2c3-544f-63dc-a00f-6510a970ea6f.png)
同じように読込してみた！！
きれいに出来たとみせかけて、**「id」**の列が**文字型**から**整数型**に変換されてしまった。
自動検出あるある。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/01e04b93-6a78-9f72-f1cc-9bff632cee0a.png)
こうした場合、また、元データの変更が出来ない場合は、テーブルを作成する際に自動検出ではなく、手動でカラム名とデータ型を指定する！！

###⑤カラム名とデータ型を自分で指定したい場合
元データが触れなかったり、数値が文字型でないといけないときなどは、テーブルを作成する際に自動検出ではなく「フィールドを追加」でカラム名を入力し、各データ型を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/fd7d5b1c-0f00-5a09-09e7-d3146ad54472.png)


###⑥プレビューで確認する。
できた。
元データのカラム名が日本語だったり、データ型を指定する場合は、手動でやるべし。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/3218c45a-3119-dfaf-7225-f311468cd9e1.png)

#４．SQL実行した出力結果をテーブルとして保存する
###①SQLを実行
**例：攻撃力の高い順に出力したランキングをテーブルに残したい**

```sql:攻撃力の高い順に出力
SELECT
  RANK()OVER(ORDER BY attack DESC) AS attack_rank,
  id,
  division,
  attribute,
  attack,
  defense
FROM
  `company.staff_list_utf8_manual`
ORDER BY
  1;
```
**出力結果　このままテーブルにしたい（しつこい）**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/8b6a4106-6f58-e6ea-68e2-c63ac2c31928.png)

###②クエリ上で``CREATE TABLE``するのが一番オヌヌメ。
**テーブル名「staff_attack_rank_c」**

```sql:これが一番王道かつオヌヌメ
CREATE TABLE
  company.staff_attack_rank_c AS
SELECT
  RANK()OVER(ORDER BY attack DESC) AS attack_rank,
  id,
  division,
  attribute,
  attack,
  defense
FROM
  `company.staff_list_utf8_manual`
ORDER BY
  1;
```
###③確認。そしてでけた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/8830fb69-0766-2a51-4751-0a50433526fd.png)
##え、でもクエリ打たずに画面上でテーブル作成出来そうじゃん？って思うじゃん？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/8afe41c7-cd04-07dd-efbe-1259dcf4a237.png)

###①クエリ結果右手の「結果を保存する」をクリックし、「BigQueryテーブル」を選択
###②保存先のプロジェクト、データセットを選択し、テーブル名を入力。そして保存。

###③確認。順番がめちゃくちゃで草不可避
**テーブル出来たけどORDER BY句が無効になってるー！！
ふざけんなー！！う〇こー！！！！**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340189/f3e0e492-589b-5686-5765-9ddd15bc2382.png)

###結論 クエリでCREATE TABLEすればよろし。

#オワタ。