Amazon RedshiftとDBeaverで空間検索してみた


![](https://day-journal.com/memo/images/try-071_00.gif)

![](https://day-journal.com/memo/images/try-071_00.png)

この記事は、「[AWS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/aws)」の2日目の記事です。

### Amazon RedshiftとDBeaverで空間検索をしてみました :tada:  

今回は、AWSが提供するクラウドデータウェアハウスの[Amazon Redshift](https://aws.amazon.com/jp/redshift)に[DBeaver](https://dbeaver.io)で接続し、位置情報データのインポートや空間関数を実行してみました!

<br>

## 位置情報データの事前準備
事前準備として[QGIS](https://qgis.org/ja/site)を利用し、ランダムポイント(青色の100万件)と空間検索用ポリゴン(黄色の3件)を、Amazon Redshiftで標準対応しているshapefile形式で準備しました。

- [QGIS #065 - 指定範囲にランダムポイント作成](https://day-journal.com/memo/qgis-065)

![画像](https://day-journal.com/memo/images/try-071_04.png)

また、Amazon Redshiftにインポートするためにデータ一式をS3にアップロードしておきます。
![画像](https://day-journal.com/memo/images/try-071_05.png)

<br>

## Amazon Redshiftのクラスター作成
はじめに、Amazon Redshiftのクラスターを作成します。

<br>

AWSコンソールでAmazon Redshiftを選択 → クラスター → クラスターを作成をクリック。
![画像](https://day-journal.com/memo/images/try-071_01.png)

クラスター名・無料トライアル・ユーザー名・パスワードを設定 → クラスターを作成をクリック。
![画像](https://day-journal.com/memo/images/try-071_02.png)

しばらくするとクラスターが作成されます。
![画像](https://day-journal.com/memo/images/try-071_03.png)

これでAmazon Redshiftのクラスター作成は完了になります :thumbsup: 

<br>

## ロールとパブリックアクセスの設定
次に、Amazon RedshiftからS3へアクセスするためのロール設定と、DBeaverからAmazon Redshiftへ接続するためのパブリックアクセス設定をします。

<br>

S3へアクセスするためのロールを作成します。
![画像](https://day-journal.com/memo/images/try-071_06.png)

Amazon Redshiftのクラスター詳細画面で作成したロールを割り当てます。
![画像](https://day-journal.com/memo/images/try-071_07.png)

Amazon Redshiftのクラスター詳細画面のアクション → パブリックアクセス可能な設定を変更をクリック。
![画像](https://day-journal.com/memo/images/try-071_08.png)

パブリックアクセス可能を「有効化」 → 変更を保存をクリック。
![画像](https://day-journal.com/memo/images/try-071_09.png)

有効化されているかを確認します。
![画像](https://day-journal.com/memo/images/try-071_10.png)

Amazon Redshiftのクラスター詳細画面のセキュリティグループ → インバウンドルールを追加しタイプをRedshiftに設定 → ルールを保存をクリック。
![画像](https://day-journal.com/memo/images/try-071_11.png)

インバウンドルールが設定されているかを確認します。
![画像](https://day-journal.com/memo/images/try-071_12.png)

これでロールとパブリックアクセスの設定は完了になります :thumbsup: 

<br>

## DBeaverで位置情報データをインポート
次に、[DBeaver](https://dbeaver.io)を利用しAmazon Redshiftに接続し位置情報データをインポートします。

<br>

DBeaverでAmazon Redshiftに接続します。ホスト名(クラスターエンドポイント)・ポート・データベース名・ユーザー名・パスワード・ロール名を設定します。
![画像](https://day-journal.com/memo/images/try-071_13.png)

ランダムポイント(100万件)をインポートしてみます。事前にテーブルを作成し、インポートしたいshapefileの格納先とロールを指定し実行します。

```sql
CREATE TABLE points (
   wkb_geometry GEOMETRY,
   id BIGINT
  );

COPY points FROM 's3://redshift-geo-data/points.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::xxxxxxx:role/redshift-geo-role-2112';
```

![画像](https://day-journal.com/memo/images/try-071_14.png)

インポートされると、マップ上で可視化しながらデータの確認ができます。
![画像](https://day-journal.com/memo/images/try-071_15.png)

空間検索用ポリゴン(3件)をインポートしてみます。事前にテーブルを作成し、インポートしたいshapefileの格納先とロールを指定し実行します。

```sql
CREATE TABLE polygon (
   wkb_geometry GEOMETRY,
   id BIGINT
  );

COPY polygon FROM 's3://redshift-geo-data/polygon.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::xxxxxxx:role/redshift-geo-role-2112';
```

![画像](https://day-journal.com/memo/images/try-071_16.png)

インポートされると、マップ上で可視化しながらデータの確認ができます。
![画像](https://day-journal.com/memo/images/try-071_17.png)

これでDBeaverでの位置情報データのインポートは完了になります :thumbsup: 

<br>

## 空間関数を実行
最後に、Amazon Redshiftで[空間関数](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/geospatial-functions.html)を実行できるかを試してみます。今回は代表的な例として、「ST_AsGeoJSON」を利用しデータをGeoJSON形式に変換するのと、「ST_Within」を利用し100万件のポイントからポリゴン内にあるポイントを抽出する空間関数を実行してみます。

<br>

まずは、「ST_AsGeoJSON」を利用しデータをGeoJSON形式に変換してみます。

```sql
SELECT ST_AsGeoJSON(wkb_geometry) FROM public.polygon;
```

GeoJSON形式のデータで出力されました！
![画像](https://day-journal.com/memo/images/try-071_18.png)

次に、「ST_Within」を利用しポリゴン内にあるポイントを抽出してみます。

```sql
SELECT public.points.id, public.points.wkb_geometry FROM public.points, public.polygon WHERE ST_Within(public.points.wkb_geometry, public.polygon.wkb_geometry);
```

ポリゴン内のみのデータで出力されました！
![画像](https://day-journal.com/memo/images/try-071_19.png)

次に、「ST_Within」を利用しポリゴン内にあるポイントのカウントを抽出してみます。

```sql
SELECT COUNT(*) FROM public.points, public.polygon WHERE ST_Within(public.points.wkb_geometry, public.polygon.wkb_geometry);
```

ポリゴン内のみのカウント「5167件」が出力されました！
![画像](https://day-journal.com/memo/images/try-071_20.png)

最後に、[QGIS](https://qgis.org/ja/site)を利用した場合と空間検索結果が一致するかも確認してみたいと思います。

- [QGIS #076 - 空間検索でデータ選択](https://day-journal.com/memo/qgis-076)

同じ「5167件」になりました！
![画像](https://day-journal.com/memo/images/try-071_21.png)

<br>

#### Amazon RedshiftとDBeaverで空間検索ができました :thumbsup: 

Amazon RedshiftとDBeaverを利用することで、Amazon Redshiftで位置情報データのインポートや空間検索をできることが確認できました。今後位置情報データの分析等にもうまく利用できそうです。

当初はサービス内で利用できる、「Query Editor V2」で手軽に試そうとしましたが、現状で位置情報データのインポートや空間関数に対応していないようでした。今後対応されるともっと手軽に利用できたり、今週プレビュー版が発表された[Amazon Redshift Serverless](https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-redshift-serverless)でも手軽に利用できるようになるかもしれません :thumbsup: 

<br>

やってみたシリーズ :grinning:
<a href="https://day-journal.com/memo/tags/Try" target="_blank">tags - Try</a>

https://qiita.com/dayjournal/items/e7eeeb8f527bbbbe42cf

<br>
<br>

<a href="https://dayjournal.booth.pm" target="_blank"><img src="https://day-journal.com/memo/images/etc/book.png" alt="book"></a>