アマゾンプライムデーで青木峰郎さん著の10年戦えるデータ分析入門が安くなっていたので購入してみました。
仕事でSQLは使用するので文法はわかるのですが、OLTPシステムのデータストアとして使っているのがメインであるため、 データ分析目線でのSQLはそこまでやったことがなかったので面白かったです。最近はdbtでTransformationを管理するのがどんな感じなのか興味があるので今度試してみようと思っています。
本書では小中規模にRDBMSを使ってデータ分析を行う際によく使われることがおおいPostgreSQLを例として分析SQLについて解説しています。 本書は発売年が2015年で環境構築にはLocalにPostgreSQL環境を構築する手順が記述されています。
一方で、2023年現在だとPostgreSQLを試したいとき一番手軽な手段の一つはDockerを使ってDBを立てる方法だと思います。
自身がこの本のSQLを試す際にLocalにPostgreSQLをインストールしてデータをロードするのは面倒だし、環境が汚れるのが嫌だったのでVSCode DevcontainerでSQLを実行するための環境を構築し、PostgreSQLをサイドカーとして立ち上げられるようにしました。
既にVSCodeとDockerをLocalに入れている方は簡単にLocalに分析環境を立ち上がることができます。VSCodeとDockerを入れることさえ面倒だという方は、ブラウザとGithubアカウントさえあればGithub Codespacesで環境を立ち上げることも可能です。
コードはGithubでレポジトリを公開しています。
GithubアカウントさえあればGithub Codespacesを使って環境を立ち上げることができます。
まずはブラウザでこのレポジトリを開きます。
Code
ボタンをクリックしてCodespaces
タブを選択しCreate codespaces on main
をクリックします。
すると環境の構築が始まるので数分待ちます。
環境が立ち上がります。
終了したいときは左下のcodespace
をクリックしてメニューを表示しStop Current Codespaces
を選択するとCodespaceが止まります。
Localで環境を構築したい場合は以下の製品がインストールされている必要があります。
本記事ではインストール方法について述べませんが、それぞれの製品の公式ページを参照してもらえばインストールできると思います。 それが面倒な方はGithub Codespacesを使って手軽にやりましょう!
まずは作業ディレクトリにGithub Repositoryをクローンします。
git clone https://github.com/atsuik/sqlanalysis10years
レポジトリに移動し、VSCodeを開きます。
cd sqlanalysis10years
code .
F1
でメニューを開きDev Containers: Open Folder in Container...
を選択します。
レポジトリを選択し、OK
をクリックするとDevcontainer環境に接続します。
初回はContainerのBuildに少し時間がかかるので数分お待ちください。
データを『10年戦えるデータ分析入門』サポートページからダウンロードしてPostgreSQLにロードするためのシェルスクリプトを用意しています。
サンプルデータは最小限のデータセットと一部のテーブルについてはレコード数を増やしたデータセットが用意されており、それぞれ
load_data.sh
load_large_data.sh
でロードできます。
VSCodeのTerminalで以下のようにコマンドを実行してデータをDBへロードしてください。
./load_data.sh
大きいサンプルデータを使いたい場合は先にload_data.sh
を実行してから、load_large_data.sh
を実行してください。
一通りのデーブルが作成されたのち、一部のテーブルが再作成されます。
./load_data.sh
./load_large_data.sh
SQL実行用のJupyter Notebookをnotebook/sample.ipynb
に用意しています。
このファイルを開きます。
一つ目の実行セルを実行するとDBへ接続します。
以後コードのセルでSQLを実行することが可能です。
セルの実行ボタンをクリックするか、セルを選択してShift+Enter
でセルを実行します。
SQLを実行するためにはマジックコマンド%sql
または%%sql
をセルの最初に入力する必要があります。
SQLが一行の場合は%sql
を使用し、複数行の場合は%%sql
を使います。
例えば以下のように入力します。
一行のときは
%sql select * from access_log limit 10;
SQLが複数行にわたるときは
%%sql
select
*
from access_log
where
request_method = 'GET'
limit 10
;
でSQLを実行できます。
データ分析は自身で実際にコードを実行してみないと頭に入ってこないところが大いにあるので皆さんも環境を構築して、実際に本に書いてあるSQLを実行してみたり、SQL文に手を加えて実行してみてください。より本書の解説への理解が深まると思います。
ここからはどうやって環境を構築したかを説明していきます。使うだけなら読む必要はないので、興味がある方はどうぞ。
開発環境の構築とPostgreSQLのContainerの準備にVSCode Dev Containers を使用しています。
ざっくりいうとDevcontainerはVSCodeをDocker Container内の環境に接続して開発を行うためのExtensionです。
開発環境をContainerで作るメリットとしては
などが挙げられます。
私はその時々でWindowsでwsl、Ubuntu、Macで開発を行っているので環境を簡単に統一できるDevcontainerは重宝しています。 また、プロジェクトに新しいメンバーが入った時も、VSCodeとDockerさえインストールすれば開発環境を立ち上げられるのでオンボーディングが楽です。
定義は.devcontainer/docker-compose.yml
に記述しており、
今回は
の二つのContainerを定義しています。
app
が開発環境でContainerの定義は.devcontainer/Dockerfile
で行っています。
Juppyterの環境を構築したり、psql
をインストールしたりしています。このContainerがVSCodeが直接接続する環境です。
そしてdb
がPostgreSQLのContainerとなっています。
version: '3.8'
services:
app:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
env_file:
- .env
volumes:
- ../..:/workspaces:cached
# Overrides default command so things don't shut down after the process ends.
command: sleep infinity
# Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
network_mode: service:db
# Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
db:
image: postgres:latest
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
env_file:
- .env
# Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
volumes:
postgres-data:
app
Containerからはdb
のhostnameでPostgreSQLに接続することができます。
Devcontainer内で使用するVSCode Exteinsionは.devcontainer/devcontainer.json
で定義しています。
開発環境 app
のPython環境の設定はmicromamba
を使用しています。
micromambaのコミュニティーはDockerhubにmicromamba用のContainerを公開しています。
Containerの定義 .devcontainer/Dockerfile
はこのContainerをベースにドキュメントを参考に作成しました。
env.yaml
に必要なパッケージが記述されており、
Dockerfileの
COPY env.yaml /tmp/env.yaml
RUN micromamba install -y -n base -f /tmp/env.yaml && \
micromamba clean --all --yes
で環境構築が行われています。
サンプルデータのPostgreSQLへのロードはload_data.sh
で行っていますが、
核心部分は
PGPASSWORD=$POSTGRES_PASSWORD psql -h db -U $POSTGRES_USER $POSTGRES_DB -f load.sq
です。DBへの接続情報は.devcontainer/.env
で定義したものがContainerの環境変数に格納されています。
このコマンドでサンプルデータのロード用のSQLを実行しています。
ちなみに以下のコマンドでPostgreSQLのセッションを開いて、SQLを実行することも可能です。
PGPASSWORD=$POSTGRES_PASSWORD psql -h db -U $POSTGRES_USER $POSTGRES_DB
```