Location via proxy:   
[Report a bug]   [Manage cookies]                

【dbt】dbt ~ 環境設定 / Docker 編 ~

■ はじめに

dbt の ドキュメント化(データリネージ機能)を使うために
ローカル環境を整備してたら、docker 環境があれば
pip よりも簡単に使えることが分かったのでメモしておく

公式ドキュメントより
https://docs.getdbt.com/docs/core/installation-overview#install-dbt-core

[1] Use pip to install dbt (recommended)
[2] Use a Docker image to install dbt << 今回は、こちらを選択
[3] Install dbt from source

[1] については、以下の関連記事を参照のこと

dbt ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2023/12/16/152147

目次

【0】前提条件
 1)Docker環境
 2)DB環境
【1】ローカル環境確認
【2】Hello world
 1)ディレクトリ構成
 2)コマンド例

【0】前提条件

1)Docker環境

* 以下の関連記事を参照のこと

Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030
Docker ~ docker を sudo なしで実行する ~
https://dk521123.hatenablog.com/entry/2023/11/22/000000

2)DB環境

* 今回は、PostgreSQL を使う

Docker compose ~ PostgreSQL
https://dk521123.hatenablog.com/entry/2023/07/20/025544
Docker compose ~ Pgweb/pgAdmin ~
https://dk521123.hatenablog.com/entry/2023/08/10/111919

【1】ローカル環境確認

* DBT Version表示を通して、
 自分のローカル環境が最低限設定されているかを確認してみる

https://github.com/dbt-labs/dbt-core/pkgs/container/dbt-postgres

mkdir demo-dbt
cd demo-dbt

mkdir dbt_hello_world

$ docker run --rm -v $(pwd)/dbt_hello_world:/dbt_hello_world \
--net=host ghcr.io/dbt-labs/dbt-postgres:1.8.2 \
--version
~~~
Core:
  - installed: 1.8.3
  - latest:    1.8.7 - Update available!

  Your version of dbt-core is out of date!
  You can find instructions for upgrading here:
  https://docs.getdbt.com/docs/installation

Plugins:
  - postgres: 1.8.2 - Up to date!
~~~

解説

# --rmオプション: コンテナ終了時にコンテナ自動的に削除
# -v: ホストの dbt_hello_world をコンテナにマウント
# --net=host: コンテナにおいて、ネットワーク名前空間をホストと共有
$ docker run --rm -v $(pwd)/dbt_hello_world:/dbt_hello_world \
--net=host ghcr.io/dbt-labs/dbt-postgres:1.8.2 \
 <dbtコマンド>

【2】Hello world

1)ディレクトリ構成

~/demo-dbt
  + compose.yml
  + dbt_hello_world
      + profiles.yml
      + dbt_project.yml

compose.yml

version: '3'

services:
  # PostgreSQL
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgresql
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      PGPASSWORD: password
      POSTGRES_DB: sample
      TZ: "Asia/Tokyo"
    ports:
      - 5431:5432
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
      - ./postgres/data:/var/lib/postgresql/data
  # pgAdmin
  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin
    hostname: pgadmin
    restart: always
    ports:
      - 18081:80
    volumes:
      - volume_pgadmin:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: demo@sample.com
      PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - postgres
volumes:
  volume_pgadmin:
    name: v_pgadmin

profiles.yml

dbt_hello_world:
  target: dev
  outputs:
    dev:
      type: postgres
      threads: 1
      host: localhost
      port: 5431
      user: postgres
      password: password
      dbname: sample
      schema: dbt_demo

dbt_project.yml

name: 'dbt_hello_world'
config-version: 2
version: '1.0.0'

profile: 'dbt_hello_world'

model-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
seed-paths: ["seeds"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]

target-path: "target"
clean-targets: [target, dbt_packages]

models:
  dbt_hello_world:
    example:

2)コマンド例

$ cd ~/demo-dbt

# PostgreSQLを立ち上げる
$ docker compose up -d

# Run 'dbt debug'
$ docker run --rm --network=host \
-v $(pwd)/dbt_hello_world:/usr/app/dbt_hello_world \
ghcr.io/dbt-labs/dbt-postgres:1.8.2 \
debug --profiles-dir="/usr/app/dbt_hello_world" \
--project-dir="/usr/app/dbt_hello_world"
===
14:03:44  Running with dbt=1.8.3
14:03:44  dbt version: 1.8.3
14:03:44  python version: 3.11.2
14:03:44  python path: /usr/local/bin/python
14:03:44  os info: Linux-6.8.0-40-generic-x86_64-with-glibc2.31
14:03:44  Using profiles dir at /usr/app/
14:03:44  Using profiles.yml file at /usr/app/profiles.yml
14:03:44  Using dbt_project.yml file at /usr/app/dbt_project.yml
14:03:44  adapter type: postgres
14:03:44  adapter version: 1.8.2
14:03:44  Configuration:
14:03:44    profiles.yml file [OK found and valid]
14:03:44    dbt_project.yml file [OK found and valid]
14:03:44  Required dependencies:
14:03:44   - git [OK found]

14:03:44  Connection:
14:03:44    host: localhost
14:03:44    port: 5431
14:03:44    user: postgres
14:03:44    database: sample
14:03:44    schema: dbt_demo
14:03:44    connect_timeout: 10
14:03:44    role: None
14:03:44    search_path: None
14:03:44    keepalives_idle: 0
14:03:44    sslmode: None
14:03:44    sslcert: None
14:03:44    sslkey: None
14:03:44    sslrootcert: None
14:03:44    application_name: dbt
14:03:44    retries: 1
14:03:44  Registered adapter: postgres=1.8.2
14:03:44    Connection test: [OK connection ok]

14:03:44  All checks passed!

参考文献

* Dockerの設定は、公式ドキュメントにも載っている

https://docs.getdbt.com/docs/core/docker-install

関連記事

dbt ~ 環境設定編 ~
https://dk521123.hatenablog.com/entry/2023/12/16/152147
dbt ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/06/30/000000
dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/05/30/151003
dbt ~ ドキュメント化 / dbt docs ~
https://dk521123.hatenablog.com/entry/2023/12/10/125512
Docker ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/02/25/000000
Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030
Docker ~ 基本編 / docker network ~
https://dk521123.hatenablog.com/entry/2022/04/30/000000
Docker ~ 基本編 / Data Volume ~
https://dk521123.hatenablog.com/entry/2018/09/08/222100
Docker ~ docker を sudo なしで実行する ~
https://dk521123.hatenablog.com/entry/2023/11/22/000000
Docker compose ~ PostgreSQL
https://dk521123.hatenablog.com/entry/2023/07/20/025544
Docker compose ~ Pgweb/pgAdmin ~
https://dk521123.hatenablog.com/entry/2023/08/10/111919

【Snowflake】Snowflake ~ Timezone ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/10/09/155708

で、以下「SQL文」でトラブルシュートしていたのだが、
QUERY_HISTORYビューのSTART_TIMEとEND_TIME(特にSTART_TIME)
の時間帯が全く身に覚えない時間帯で実行されていて調べてみたら
SnowflakeのTimezoneのデフォルトがUTCじゃないことを知った。

 そこで、今回は、その調査結果も踏まえて、
SnowflakeのタイムゾーンTimezoneに関して、纏めてみた

SQL

SELECT
  CONVERT_TIMEZONE('UTC', 'Asia/Tokyo', START_TIME),
  CONVERT_TIMEZONE('UTC', 'Asia/Tokyo', END_TIME),
  *
FROM
  SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
...

目次

【0】注意点:SnowflakeのデフォルトTimezone
【1】デフォルトTimezone の調べ方
【2】Timezone を変更するには
 1)一時的に変更する
 2)恒久的に変更する
【3】Timezone に関する関数
 1)CONVERT_TIMEZONE

【0】注意点:SnowflakeのデフォルトTimezone

* SnowflakeのデフォルトTimezone は、
 JSTでもなく、UTCでもなく、
 『America/Los_Angeles(米国太平洋標準時 PST; Pacific Standard Time)』

https://www.hulft.com/help/ja-jp/WebFT-V3/COM-ADM/Content/WEBFT_ADM_COM/TimeZone/timezonelist.htm

【1】デフォルトTimezone の調べ方

SHOW PARAMETERS LIKE 'TIMEZONE';
# default は UTC じゃなく「America/Los_Angeles」...

|-------------+-----------------------+-------------------------+-----+------------|
| key             | value                          | default                          | level | description |
|-------------+-----------------------+-------------------------+-----+------------|
| TIMEZONE | America/Los_Angeles | America/Los_Angeles  |         | time zone |

https://docs.snowflake.com/ja/sql-reference/parameters#timezone

アカウント/ユーザ/セッション単位で確認

SHOW PARAMETERS LIKE 'TIMEZONE' IN ACCOUNT;
SHOW PARAMETERS LIKE 'TIMEZONE' IN USER;
SHOW PARAMETERS LIKE 'TIMEZONE' IN SESSION;

【2】Timezone を変更するには

1)一時的に変更する

-- TIMEZONE を UTC時間に設定
ALTER SESSION SET TIMEZONE = 'UTC';

https://docs.snowflake.com/ja/user-guide/date-time-examples.html

2)恒久的に変更する

-- アカウント単位でTIMEZONE を UTC時間に設定
ALTER ACCOUNT SET TIMEZONE = 'UTC';

https://docs.snowflake.com/ja/sql-reference/sql/alter-account
補足:ユーザ単位での変更

-- 用途はあんまりなさそうだが
-- ユーザ単位でTIMEZONE を UTC時間に設定
ALTER USER SET TIMEZONE = 'UTC';

https://docs.snowflake.com/ja/sql-reference/sql/alter-user

【3】Timezone に関する関数

1)CONVERT_TIMEZONE

* タイムスタンプを別のタイムゾーンに変換

https://docs.snowflake.com/ja/sql-reference/functions/convert_timezone

構文

CONVERT_TIMEZONE( <source_tz> , <target_tz> , <source_timestamp_ntz> )

CONVERT_TIMEZONE( <target_tz> , <source_timestamp> )

サンプル

SELECT
  CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', START_TIME) AS START,
  CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', END_TIME) AS END,
  *
FROM
  SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
ORDER BY
  START_TIME DESC
LIMIT
  100
;

参考文献

https://qiita.com/yappoi3/items/6a7dfbc9f82efccb3cfb
https://zenn.dev/kommy339/articles/f84312dda0d7d8

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / データ型 ~
https://dk521123.hatenablog.com/entry/2021/12/16/095524
Snowflake ~ 基本編 / キャスト ~
https://dk521123.hatenablog.com/entry/2021/12/15/162658
Snowflake ~ 日時関連 ~
https://dk521123.hatenablog.com/entry/2022/06/17/113003
Snowflake ~ 日時関連 / 日時取得関数 ~
https://dk521123.hatenablog.com/entry/2022/09/02/092144
Snowflake ~ QUERY_HISTORY ビュー ~
https://dk521123.hatenablog.com/entry/2024/10/09/155708

【Snowflake】Snowflake ~ QUERY_HISTORY ビュー ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/08/03/000817

で、Snowflakeのトラブルシューティングのための統計情報を取得する方法を
扱っていたが、
今日、QUERY_HISTORY ビューを使って、トラブルシュートしたので
改めて、別冊で扱ってみた。

目次

【1】QUERY_HISTORY ビュー
【2】得られる情報
【3】使用上の注意
【4】サンプル
 1)トラブルシュートのためのクエリ実行一覧表示
 2)クエリ実行一覧から何件更新されたかを表示

【1】QUERY_HISTORY ビュー

https://docs.snowflake.com/ja/sql-reference/account-usage/query_history

* 過去365日間(1年間)以内のSnowflakeクエリ履歴を取得する

【2】得られる情報

* 以下を参照。

https://docs.snowflake.com/ja/sql-reference/account-usage/query_history#columns

主なパラメータ

Column Names Explanations Memo
DATABASE_NAME/SCHEMA_NAME DB名/スキーマ
WAREHOUSE_NAME ウェアハウス名
QUERY_TEXT 実行したSQL LIKEで絞るといい感じ
START_TIME 開始日時
END_TIME 終了日時
TOTAL_ELAPSED_TIME 経過時間(ミリ秒単位) 長時間かかっているSQL文を選査できる
EXECUTION_TIME 実行時間(ミリ秒単位)
ROWS_INSERTED/UPDATED/DELETED etc クエリによって挿入/更新/削除された行の数

【3】使用上の注意

https://docs.snowflake.com/ja/sql-reference/account-usage/query_history#usage-notes

* ビューの遅延は最大45分

【4】サンプル

1)トラブルシュートのためのクエリ実行一覧表示

SELECT
  CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', START_TIME) AS START,
  CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', END_TIME) AS END,
  *
FROM
  SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
  USER_NAME = 'your_user'
  AND ROLE_NAME = 'your_role'
  AND START_TIME >= '2024-10-08 05:00:00+00:00'
  AND QUERY_TEXT LIKE '%your_table%'
ORDER BY
  START_TIME DESC
LIMIT
  100
;

2)クエリ実行一覧から何件更新されたかを表示

SELECT
  MIN(CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', START_TIME)) AS START,
  MAX(CONVERT_TIMEZONE('America/Los_Angeles', 'Asia/Tokyo', END_TIME)) AS END,
  SUM(ROW_INSERTED)
FROM
  SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
  USER_NAME = 'your_user'
  AND ROLE_NAME = 'your_role'
  AND START_TIME >= '2024-10-08 05:00:00+00:00'
  AND QUERY_TEXT LIKE '%your_table%'
GROUP BY ALL
ORDER BY
  START_TIME DESC
;

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 統計情報 ~
https://dk521123.hatenablog.com/entry/2023/08/03/000817
Snowflake ~ TAG ~
https://dk521123.hatenablog.com/entry/2023/08/08/172648
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ ストレージ統合の作成手順 ~
https://dk521123.hatenablog.com/entry/2023/07/27/000000
Snowflake ~ 日時関連 ~
https://dk521123.hatenablog.com/entry/2022/06/17/113003
Snowflake ~ 日時関連 / 日時取得関数 ~
https://dk521123.hatenablog.com/entry/2022/09/02/092144
Snowflake ~ Timezone ~
https://dk521123.hatenablog.com/entry/2024/10/10/002436