🚀

dbtをつかって、athenaをデータウェアハウス化する

2023/12/26に公開

AWSathenaはS3へ保続されているデータに直接SQLを発行できるサーバレスなサービスです。通常はデータレイクに対するアドホック分析として使用されるathenaですが、今回はdbtと組み合わせて、データウェアハウスのように使えるようにしてみます。

事前準備

事前に以下を設定しておきます。

  • aws cliの設定
  • dbt-athenaのインストール
    pip install dbt-athena-community
    # バージョンの確認
    dbt --version
    Core:
    - installed: 1.7.4
    - latest:    1.7.4 - Up to date!
    
    Plugins:
    - athena: 1.7.0 - Ahead of latest version!
    
  • S3バケットの作成(今回はjaffle-shop-2312という名前で作成)
  • こちらのチュートリアルレポジトリをcloneする。

dbtのセットアップ

profiles.ymlに次の設定を追加します。

~/.dbt/profiles.yml
jaffle_shop:
  target: athena
  outputs:
    athena:
      database: awsdatacatalog
      region_name: ap-northeast-1
      s3_data_dir: s3://jaffle-shop-2312/tables
      s3_staging_dir: s3://jaffle-shop-2312/athena_query_result
      s3_data_naming: table
      schema: jaffle_shop
      threads: 1
      type: athena
      aws_profile_name: default
      workgroup: primary

いくつかオプショナルな設定はありますが、意味としては以下の通りです。

  • database
    • データソースの設定、通常はawsdatacatalogでOK
  • region_name
    • リージョン
  • s3_data_dir
    • athenaのデータを格納するS3パス
  • s3_staging_dir
    • クエリ結果やmetadataを格納するS3パス
  • s3_data_naming
    • デフォルトでは、S3へはスキーマ名/テーブル名となりますが、テーブル名のみにする。(後述します。)
  • schema
    • デフォルトのデータベース名
  • aws_profile_name
    • awsのプロファイル名
  • workgroup
    • ワークグループ名

詳細についてはREADMEを参考にします。

https://github.com/dbt-athena/dbt-athena?tab=readme-ov-file#configuring-your-profile

実行

それでは、まずはそのまま実行してみます。

dbt seed
dbt run

実行結果を見てみましょう。しっかりとathenaエディタにデータが表示されていますね。
Alt text

s3にもデータが保存されています。
ここで、tablesの下の階層は、テーブル名になっていますが、上述のs3_data_namingschema_table_uniqueと指定すると、tables/データベース名/テーブル名となります。データベースを切り分けてテーブルを作成する際にはスキーマ名(データベース名)も階層に入れておいたほうがよさそうです。

Alt text
Alt text

パーティション設定

S3には、パーティションが設定されていることが多いので、dbtの下流モデルにもパーティションを設定してみます。
models/orders.sqlに以下の変更を加えます。

  • モデル定義の上部に、configを加え、order_dateをパーティション化するように指定する。
  • パーティション列は、テーブルの最後に持ってくる必要があるため、order_dateの位置を移動するする。
models/orders.sql
+ {{ config(
+     materialized='table',
+     partitioned_by=['order_date'],
+ ) }}
...
    select
        orders.order_id,
        orders.customer_id,
        orders.status,
-        orders.order_date
        {% for payment_method in payment_methods -%}
        order_payments.{{ payment_method }}_amount,
        {% endfor -%}
        order_payments.total_amount as amount,
+        orders.order_date
    from orders
...

Alt text
Alt text

ちゃんとパーティションテーブルになっているようです。

まとめ

athenaとdbtを使った事例は少ないので、ベストプラクティスをさぐっていきたいです。

参考

dbt-athenaことはじめ
Amazon Athenaに対してローカル環境からdbtを使ってみた

GitHubで編集を提案

Discussion