こちらの記事は Databricks Advent Calendar 2022 の22日目の記事になります。
こんにちは、カケハシで Musubi Insight のバックエンドエンジニアをしている末松です。
カケハシでは 全社的なデータ活用基盤のプラットフォームとしてDatabricksを採用 しておりますが、それまでは Redash を利用していました。
Redash は Databricks社にM&A された背景もあり、基本的には Redash を使っていた感覚のまま Databricks SQL を使用することができます。
とはいえ細かなところに違いがあるので、カケハシ内でも Redash を活用してきた自負のある1人として
- 便利になること
- できなくなること
- 変わらずできること
の3本立てで紹介していこうと思います!
Redash => Databricks SQL への移行で「便利になること」
Redash から Databricks SQL に移行することで便利になること、以下の4点をピックアップして紹介します!
- ブラウザタブを複数開く必要がなくなる!
- データベースが異なるテーブルの join ができるように!
- SQL の文法が統一される
- Query の実行結果のプロファイルを見ることができる!
ブラウザタブを複数開く必要がなくなる!
Redash では複数の Query を開くためにはブラウザで複数のタブを開く必要がありましたが、Databricks では1つのタブ内で複数 Query を開くことができるようになりました!
Query ごとの実行結果や保存/未保存がわかるのも地味にありがたいですね。
データベースが異なるテーブルの join ができるように!
Redash ではデータベース(データソース)が異なるテーブル同士を join するためには、Query Results を利用する必要がありました。
DB_A.table_a
と DB_B.table_b
を join するケースを例に挙げると、
DB_A をクエリする Query1 を作成する
SELECT * FROM DB_A.table_a
DB_B をクエリする Query2 を作成する
SELECT * FROM DB_B.table_b
DB_A と DB_B を join する Query3 を作成する
SELECT * FROM query_1 as a JOIN query_2 as b ON a.id = b.id
というように3つの Query を作成する必要がありました。
これが Databricks では
SELECT * FROM DB_A.table_a as a JOIN DB_B.table_b as b ON a.id = b.id
と1つの Query で書けるようになったので革命的に楽になりました!
SQL の文法が統一される
Redash ではデータソースの連携先によって SQL の文法が異なるので、なぜか Query がエラーすると思ったら違う文法で書いてしまっていたことは1度や2度どころではありません。
データソースへの接続設定のみで連携が完了する Redash に比べ Databricks はデータを連携するために一手間必要であるものの、Databricks SQL の利用者観点であれば SQL の文法が統一されるので SQL の文法の違いに悩まされることはなくなります。
ただし Databricks SQL 独自の文法 になるのでキャッチアップが必要になってしまいますが...
Query の実行結果のプロファイルを見ることができる!
これは Databricks SQL を触っていてびっくりした機能なのですが、実行した Query がどのような実行計画でどのくらいのデータを読み込んでいてどこに時間がかかっているのかなどを確認することができます!
思ったより実行時間のかかる Query の原因調査だったり、もしかすると分散基盤での Query( Presto や Apache Spark など) がどのように実行されるかの勉強にも使えるかもしれません。
Redash => Databricks SQL への移行で「できなくなること」
Redash から Databricks SQL に移行することでできなくなることとしては、現在以下の1点を確認しています。
(※ 使い方を把握してないだけの可能性もありますので、良い方法があれば教えてください!)
- 「Google スプレッドシート」との連携
「Google スプレッドシート」との連携
Redash では Google スプレッドシート との連携機能として、
- Google スプレッドシート => Redash
- Google スプレッドシート の内容を Redash に連携し、Query Results を使うことでその内容を他のテーブルと join する
- 参考: https://blog.chick-p.work/blog/redash-spreadsheet
- Redash => Google スプレッドシート
- Redash の Query の結果を Google スプレッドシート の特定のシートに反映する
- 参考: https://qiita.com/yamaking/items/aa6ef37ec0f2b0b3de3d
なんてことができましたが、Databricks SQL では同じようなやり方はできないようです。
自前で Databricks に連携する 方法 は紹介されていましたが、 Databricks の機能としての連携方法などは今のところ目にしていません。
Redash => Databricks SQL への移行でも「変わらずできること」
最後に、Redash でも Databricks SQL でも変わらずできることを紹介します。
- Query のスケジュール実行
- Query 結果によるアラート設定
- Query Parameter の設定と Dashboard への反映
- Query Filter の設定と Dashboard への反映
- Query 結果に HTML を埋め込む
Query のスケジュール実行
Query を定期的に自動実行させることができるスケジュール機能がありますが、Redash と Databricks SQL 共に使用することができます。
- Redash: https://redash.io/help/user-guide/querying/scheduling-a-query
- Databricks SQL: https://docs.databricks.com/sql/user/queries/schedule-query.html
ただし設定できる内容に若干の違いがありました。
Redash: 1min, 5min, 10min, 15min, 30min, 1h, 2h, 3h, 4h, 5h, 6h, 7h, 8h, 9h, 10h, 11h, 12h, 1d, 30d, 1w, 2w Databricks SQL: 1min, 5min, 10min, 15min, 30min, 1h, 2h, 3h, 4h, 5h, 6h, 8h, 12h, 1d, 1w, 1month
あまり使われていない設定値がなくなって 30d が 1month になった感じでしょうか。
Query 結果によるアラート設定
Query を定期的に実行させる中で、ある条件をみたす場合にアラートを飛ばすことのできる機能ですが、こちらも Redash と Databricks SQL で同様の機能があります。
- Redash: https://redash.io/help/user-guide/alerts
- Databricks SQL: https://docs.databricks.com/sql/user/alerts/index.html
ただし Databricks SQL の方が機能が拡張されており使いやすくなっています!
- Aggregate が追加され、集計した結果を条件に使用することができるようになりました( Redash では最初の1行のみが対象になってました)
- 集計結果の Preview も可能になっていました
- Refresh の設定が追加され、Query 側でスケジュールを設定しなくても良くなりました
Query Parameter の設定と Dashboard への反映
Query の中に Parameter を設定することができる機能ですが、Redash と Databricks SQL で同様の機能があります。
- Redash: https://redash.io/help/user-guide/querying/query-parameters
- Databricks: https://docs.databricks.com/sql/user/queries/query-parameters.html
この Query Parameter は Dashboard にも適用できるのですが、この適用方法の種類(以下の3種類)に関しても Redash と Databricks SQL で同じ仕様になっています。
- 「dashboard parameter」 ダッシュボード内で共通化された可変パラメータ
- 「Widget parameter」Widget(グラフ)のみに適用する可変パラメータ
- 「Static value」Widget(グラフ)のみに適用する固定パラメータ
Query Filter の設定と Dashboard への反映
Query Filter は Query 実行後の結果からフィルターを行うことができる機能で、Query Parameter に比べて軽量に動かすことができるのが特徴的です。
この Query Filter に関しても、Redash と Databricks SQL の両方で利用できます。
- Redash: https://redash.io/help/user-guide/querying/query-filters
- Databricks: https://docs.databricks.com/sql/user/queries/query-filters.html
ただし Databricks SQL になって Query Filter の設定の仕方が変更されており、
Redash では Query 内で対象にしたいカラム名の末尾に ::filter
あるいは __filter
などを付与する設定方法でしたが、
SELECT action AS "action::filter", COUNT(0) AS "actions count" FROM events GROUP BY action
Databricks SQL では Query Editor 上のボタンから設定することができるようになったようです。
( Redash と同じ設定方法も利用できるようですが、legacy になっていました)
また、Query Filter も Query Parameter 同様 Dashboard に適用できるのですが、今のところDatabricks SQL では Widget 内に Query Filter を設定することができず Dashboard level での設定のみが可能なようです。
Query 結果に HTML を埋め込む
Redash では Query 結果に HTML を埋め込むことで、色付けやリンク添付を行う ことができました。
Databricks SQL でも Visualization の設定が必要ですが同様のことができるようになっていました。
このブログを書いている時に気付いた機能なのですが、Table の Visualization の設定の中に 「Font conditions」なるものがあり、どうやらセルの値によって色を変えられる機能があるようです!
上の画像の結果には、以下のようなルールを Font conditions を使って設定してみています。
- a_count >= 100 であれば青文字
- total >= 500 であれば青文字
- a_rate < 40 であれば赤文字
使える場面は結構ありそうですね!
最後に
Redash から Databricks SQL へ移行する際にどんな変化があるのか紹介していきました。
基本的には Databricks SQL に移行することによるメリットは大きいと感じていますし、基本的な View は同じなのですんなり慣れることができると思います!
そんな Databricks を導入しているカケハシですが、現在多種多様なポジションでの採用を行なっております!
以上!