/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2023/02/15 読んだ記事まとめ(DATA MESH in Snowflake)

この前ラジオで流れて来た 燃え殻 さんという作家の話し口が心地よかったので、本も読んでみました:

すべて忘れてしまうから

これはエッセイ集なのですが、不思議と自分の昔の忘れていたことを思い出しました。タイトルにもあるように、人間は日々いろんなことがある傍らでいろんなことを忘れていきます。僕は小学校中学校の友達と話していると、さっぱり記憶にないような話題がたまに出てきて驚きます。昔のことは夢なのか現実なのか、たまに分からなくなることもあります。

この本は文章を読みながら、読んでいない気持ちにもなる不思議な本でした。文章を追いながら気づいたら自分の昔のことを考えていて、花の蜜を吸いながら下校していたツツジの植え込みの高さが、今はずいぶん低く見えることに気がついたりとか、僕が小さいころの東京の排気ガスの匂いとか、どこか日差しが心地よかった日の記憶をぼんやり思い出しました。

5 ChatGPT features to boost your daily work

medium.com

ソフトウェア開発での ChatGPT の使い方。上の記事ではソースコードを貼り付けたりしていて、公開されている ChatGPT を業務で使うにはかなりリスクがありそうですが、自然言語ではなくプログラムに対しても直接アプローチできるのは面白いですね。学校の課題とかなら、すぐに答えに近しいプログラムを返してくれそう…

DATA MESH in Snowflake

medium.com

タイトルがかなり目を惹きました。データメッシュについて簡潔に紹介しながら、Snowflake との相性の良さを説明しています。

一般的にはデータウェアハウスは中央集権的に管理してサイロ化を防ぐべきと言われていましたが、中央のデータエンジニアは連携元サービスのドメイン知識がなく、機敏さに欠けるなどの欠点があります。このアプローチに対して、データメッシュが備えるべき4つの特徴が紹介されています:

  • ドメイン中心のオーナーシップとアーキテクチャ
    • データパイプラインはドメイン知識のあるチームによって管理。各ドメインはガバナンスやリネージなどに責任をもつ
  • データ as a プロダクト (DaaP)
    • データは見つけやすく、利用しやすい状態にする。プロダクトとして提供するため、各ドメインはデータ品質にも責任を負う
  • セルフサービスデータプラットフォーム
    • ツールは共通で利用できるものを開発・提供し、メンテナンスコストを下げる。ツールはドメイン非依存であるべき
  • 連合性のデータガバナンス
    • データガバナンスポリシーを全社で定め、実際の運用は各ドメインごとに行う

Snowflake に話を戻すと、Snowflake にはデータメッシュと相性のよい様々な機能があります。

記事中にも紹介されていますが、私が一番大きな利点だと思うのが Snowflake のデータシェアの機能です。Snowflake では、あるアカウントのデータを別のアカウントに共有することができます。粒度も非常に細かく指定することができるため、「データをプロダクトとして提供する」というデータメッシュの特徴と相性がよいです。共有するデータはデータクレンジングやエンリッチメントが終わったものだけを対象にするとか、集計済みデータだけを共有対象にするなど、高品質なデータだけを共有するとよさそうです。

アカウントが分かれていればリソースを食い合うこともないため、データメッシュの特徴3つ目も自然と兼ね備えることができます。

Snowflake とデータメッシュを紐づけて考えたことがあまりなかったので、短い記事ですが視野が広がりました。

5 Snowflake Query Tricks You Aren’t Using but Should Be

medium.com

Snowflake で使える tips 集です。QUALIFY, IFF, PIVOT, TRY_TO_DATE, Variable Referencing の5つが紹介されています。

Variable Referencing はとても便利で、Snowflake ではカラムのエイリアスに同じSELECT文でアクセスできます。GROUP BY や HAVING なんかは特に複雑なカラムを指定しなければならなかったのが、エイリアスを指定することでクエリがすっきりします。

QUALIFY はデータのフィルタ条件にウィンドウ関数をそのまま持ってこれるようです。公式の例から持ってきました:

SELECT * 
    FROM (
         SELECT i, p, o, 
                ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num
            FROM qt
        )
    WHERE row_num = 1
    ;
+---+---+---+---------+
| I | P | O | ROW_NUM |
|---+---+---+---------|
| 1 | A | 1 |       1 |
| 3 | B | 1 |       1 |
+---+---+---+---------+

上のクエリが、QUALIFY を用いて以下のように書けます:

SELECT i, p, o
    FROM qt
    QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1
    ;
+---+---+---+
| I | P | O |
|---+---+---|
| 1 | A | 1 |
| 3 | B | 1 |
+---+---+---+

行番号やランクでフィルタリングしたいことは割とよくあると思うので、頭の片隅に入れておくと役立ちそうです(シンタックスシュガーなのか実行計画にも最適化が入るのかは読み取れませんでした)