自分用Google Cloud コマンドリファレンス(分析系)

## 順次追記予定

## 全般
### クライアントの更新

```console
$ sudo gcloud components update
```

### デフォルトプロジェクトの確認

```console
$ gcloud config list
```

### デフォルトプロジェクトの切り替え

```console
$ gcloud config set project <project name>
```

### 実行時プロジェクト指定

```console
$ gcloud --project <project id>
```

### Project毎のクォータ

```console
$ gcloud compute regions list
```

### 今使えるコンポーネントの確認
```console
$ gcloud components list
```

### サービスアカウントの認証
```console
$ gcloud auth activate-service-account \
<service account 名>@<project-name>.iam.gserviceaccount.com \
--key-file <IAM画面で発行したキーjsonファイル> \
--project <<project-name>>
```

## GCE
### インスタンスの一覧
```console
$ gcloud compute instances list
```

### インスタンスの作成
```console
$ gcloud compute instances create test-instance --project test_pj --zone asia-east1-a 
```

### Firewallのルール参照

```console
$ gcloud compute routes list
```

## BigQuery
### 実行時プロジェクトの切り替え

```console
$ bq --project_id <project id>
```

### 特定PJのジョブの一覧

```console
$ bq ls -j --all
```

### 特定ジョブの詳細

```console
$ bq --format prettyjson show -j <job id>
```

### テーブルの作成

* まずは、データセットの作成
 
 ```console
 $ bq mk <project name>:<dataset name>
 ```

* デーブルの作成

 ```console
 $ bq mk --schema id:integer,name:string -t <dataset name>.<table name>
 ```

### テーブルの作成(カラムのmodeをしている場合)
* bqコマンドにschemaを直接書く場合、modeが指定できない。デフォルトのnullableになる。

```console
$ bq mk --schema schema.ddl  -t <dataset name>.<table name>
```

```json:schema.ddl
[
  {"name": "name", "type": "string", "mode": "required"},
  {"name": "gender", "type": "string", "mode": "nullable"},
  {"name": "count", "type": "integer", "mode": "repeated"}
]
```

* パーティションテーブルにする場合は、以下のオプションを付ける

```
--time_partitioning_type=DAY
```

* 任意の日付カラムを使ったパーティションテーブル(Beta)にする場合は、以下のオプションを付ける

```
 --time_partitioning_field　[COLUMN]
```

### テーブルの一覧

```console
$ bq ls <dataset name>
```

### テーブルのスキーマ情報を出力

```console
$ bq show --schema --format=prettyjson <dataset name>.<table name>
```

### データのエクスポート
```sh
bq extract <dataset name>.<table name> gs://<bucket name>/<file name>
```

* データ量が多い場合、ファイル名に*をつけておくこと。そうすると勝手にファイル分割する。

### データのロード(区切り文字がパイプの場合)
```sh
bq load -F '|' <dataset name>.<table name> gs://<bucket name>/<target file(pipe splited)>
```

### データロードに区切り文字「x001」を指定
* コンソールに入力しづらい制御文字などを区切り文字とする場合
* hiveがデフォルトこの区切り文字を使う

```console
$ bq load -F "`echo $'\x01'`" <dataset name>.<table name> gs://<bucket name>/<target file(x001 splitted)>
```

### 複数行のコメント

```sql
/*
コメント内容
*/
```

### パーティションテーブルの情報取得クエリ

```sql
select * from [<project id>:<dataset name>.<table id>$__PARTITIONS_SUMMARY__]
```

bqコマンドで出力すると以下の情報が取得できる

```
|   project_id    | dataset_id | table_id | partition_id | creation_time | last_modified_time |
```

### TIMESTAMPカラムをパーティションにしたり、Clusteredテーブルに変換する

```sh
bq query --destination_table <出力先データセット名>.<出力先テーブル名> --nouse_legacy_sql --time_partitioning_field <パーティションに使うTIMESTAMP型のカラム名> --clustering_fields [,区切りのクラスター対象のカラム名] 'SELECT * FROM `<project id>.<データセット名>.<テーブル名>`'
```

## GCS
### linuxサーバからのデータのコピー
```console
$ gsutil copy <local file name> gs://<bucket name>/
```

## PubSub
### トピックを作成する
```sh
gcloud pubsub topics create <トピック名>
```

https://cloud.google.com/sdk/gcloud/reference/pubsub/topics/create

### サブスクリプションを作成する
```sh
gcloud pubsub subscriptions create --topic=<トピック名> <サブスクリプション名>
```

https://cloud.google.com/sdk/gcloud/reference/pubsub/subscriptions/create

### トピックにメッセージを送る
```sh
gcloud pubsub topics publish <トピック名> --message='{"name":"taro","age":10}' --attribute=[<key1="val",key2="val",...>]
```

https://cloud.google.com/sdk/gcloud/reference/pubsub/topics/publish

###　サブスクリプションからメッセージを取得する
```sh
gcloud pubsub subscriptions pull --auto-ack <サブスクリプション名>
```

- --auto-ack をつけるとサブスクリプションから消えます。つけないと別のクライアントから同じデータが取得できます。

https://cloud.google.com/sdk/gcloud/reference/pubsub/subscriptions/pull

## Dataproc
### クラスタの作成
- コンポーネントゲートウェイを有効化し、Jupyterをコンポーネントとしてインストールする例

```.sh
gcloud dataproc clusters create --region=us-central1 \
    --enable-component-gateway \
    --optional-components=JUPYTER <クラスタ名>
```

### クラスタの一覧

```.sh
gcloud dataproc clusters list --region us-central1
```

### クラスタの削除

```.sh
gcloud dataproc clusters delete <クラスタ名> --region us-central1
```

## 番外編
### curlでGCS操作
* GCEか、Google cloud shellで下記コマンドを実行してtokenを取得。返ってきたJSONの"access_token"フィールドの値を得る。

```sh
curl "http://metadata/computeMetadata/v1/instance/service-accounts/default/token" -H "X-Google-Metadata-Request: True"
```

* バケットの中身を見る。JSONで返ってくる。

```sh
curl -X PUT  -X GET  -H "Authorization: Bearer <accsess_token>" "https://www.googleapis.com/storage/v1/b/<bucket_name>/o"
```

* ローカルファイルを送る

```sh
curl -X POST --data-binary @hogehoge.txt -H "Authorization: Bearer <access_token>" "https://www.googleapis.com/upload/storage/v1/b/<bucket_name>/o?name=hogehoge.txt"
```