Databricks SQL Statement Execution APIを使ってみる

こちらのDatabricks SQL Statement Execution APIを試してみます。

https://qiita.com/taka_yayoi/items/140b0239709ff06a4955

# 要件

- 稼働しているDatabricksワークスペース(プレミアム/エンタープライズプラン)
- [Databricks SQLウェアハウス](https://qiita.com/taka_yayoi/items/23d7789198c2dcd66381)
- [パーソナルアクセストークン](https://qiita.com/taka_yayoi/items/f5493a4169e95e1a7a61)

# 準備

1. [パーソナルアクセストークン](https://qiita.com/taka_yayoi/items/f5493a4169e95e1a7a61)を生成してメモしておきます。
1. アクセスするDatabricks SQLウェアハウスがなければ作成します。
1. SQLウェアハウスの画面にアクセスしてウェアハウスのIDをコピーしておきます。
![Screenshot 2023-03-08 at 10.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4932ea7b-78f8-937c-a223-1534506bb082.png)
1. [ワークスペースのホスト名](https://qiita.com/taka_yayoi/items/7127cabac70dd994fcba#%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%90%8Durlid)をメモしておきます。`https://`や末尾の`/`は不要です。
1. REST APIを呼び出すマシンで環境変数を設定します。以下の例はMacでのターミナルで実行しています。SQL文は`SELECT * FROM hive_metastore.japan_covid_takaakiyayoidatabrickscom.covid_cases LIMIT 10`としています。

    ```bash
    export DATABRICKS_TOKEN='<パーソナルアクセストークン>'
    export DATABRICKS_HOST='<Databricksワークスペースのホスト名>'
    export DATABRICKS_SQL_WAREHOUSE_ID='<SQLウェアハウスID>'
    ```
1. curlを使ってREST APIを呼び出します。

    ```bash
    curl --request POST \
    https://${DATABRICKS_HOST}/api/2.0/sql/statements/ \
    --header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
    --header "Content-Type: application/json" \
    --data '{
      "warehouse_id": "'"$DATABRICKS_SQL_WAREHOUSE_ID"'",
      "catalog": "samples",
      "schema": "tpch",
      "statement": "SELECT * FROM hive_metastore.japan_covid_takaakiyayoidatabrickscom.covid_cases LIMIT 10"
    }' | jq
    ```

以下のレスポンスが返ってきます。

```json:JSON
{
  "statement_id": "01edbd4f-8398-1304-a164-c5f1d85fbb8a",
  "status": {
    "state": "SUCCEEDED"
  },
  "manifest": {
    "format": "JSON_ARRAY",
    "schema": {
      "column_count": 5,
      "columns": [
        {
          "name": "Prefecture",
          "type_text": "STRING",
          "type_name": "STRING",
          "position": 0
        },
        {
          "name": "Cases",
          "type_text": "BIGINT",
          "type_name": "LONG",
          "position": 1
        },
        {
          "name": "date_timestamp",
          "type_text": "TIMESTAMP",
          "type_name": "TIMESTAMP",
          "position": 2
        },
        {
          "name": "pref_no",
          "type_text": "INT",
          "type_name": "INT",
          "position": 3
        },
        {
          "name": "Area",
          "type_text": "STRING",
          "type_name": "STRING",
          "position": 4
        }
      ]
    },
    "total_chunk_count": 1,
    "chunks": [
      {
        "chunk_index": 0,
        "row_offset": 0,
        "row_count": 10
      }
    ],
    "total_row_count": 10
  },
  "result": {
    "chunk_index": 0,
    "row_offset": 0,
    "row_count": 10,
    "data_array": [
      [
        "Hokkaido",
        "24",
        "2022-01-01T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "6",
        "2022-01-02T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "15",
        "2022-01-03T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "30",
        "2022-01-04T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "60",
        "2022-01-05T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "62",
        "2022-01-06T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "98",
        "2022-01-07T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "148",
        "2022-01-08T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "99",
        "2022-01-09T00:00:00.000Z",
        "1",
        "北海道地方"
      ],
      [
        "Hokkaido",
        "95",
        "2022-01-10T00:00:00.000Z",
        "1",
        "北海道地方"
      ]
    ]
  }
}
```

REST APIを使ってアプリケーションを構築するケースは多いと思いますので、こちらのREST APIをご活用いただくことで柔軟にデータアプリケーションを構築いいただけるかと思います。ぜひご活用ください！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)