Databricks Appsを触ってみた【Streamlit】

Databricks Appsを触ってみた【Streamlit】

Clock Icon2025.04.16

データ事業本部のueharaです。

今回は、Databricks Appsを触ってみたいと思います。

前提

私の手元環境では、以前までの検証で『MovieLens』というデータセットを用いて movies テーブル と ratings テーブルを既にDatabricks上で作成しています。

※MovieLensデータセットは映画作品レビューサイトの作品評価データで、その中でも開発用の規模の小さいデータを利用しています。

具体的には、既に以下のようなテーブルが作成されています。

  • movies テーブル

0416_dbc_01

  • ratings テーブル

0416_dbc_02

今回はこれらのテーブルを利用するような形でDatabricks Appsを作成してみます。

なお、 movielens スキーマにはどのユーザーもアクセスできるようPermissionを設定しています。

0416_dbc_11

サンプルアプリの作成

Databricksトップ画面の左側のタブから、『+ New』を押下し、『App』を選択します。

0416_dbc_03

ここで、アプリは『Template』から『Streamlit』の『Hello world』を選択してみます。

0416_dbc_04

その後の適当にアプリ名を入力してデプロイが完了すると、以下のようになっているかと思います。

0416_dbc_05

表示されたアプリケーションのURLにアクセスしてみると、以下のようにサンプルアプリの出力が表示されました。

0416_dbc_06

Appsのページに戻って、今度はソースのURLを確認してみます。

0416_dbc_07

すると以下のように、アプリケーションのファイル群を確認できます。

0416_dbc_08

サンプルアプリを編集

先ほどの app.py を編集して、以下のようにしてみます。

app.py
import os
import pandas as pd
import streamlit as st
from databricks import sql
from databricks.sdk.core import Config

# Databricks SQL Warehouse に接続してクエリを実行
def sqlQuery(query: str) -> pd.DataFrame:
    cfg = Config()  # 認証情報を取得
    warehouse_id = os.getenv("DATABRICKS_WAREHOUSE_ID")
    assert warehouse_id, "DATABRICKS_WAREHOUSE_ID must be set in environment or app.yaml"

    with sql.connect(
        server_hostname=cfg.host,
        http_path=f"/sql/1.0/warehouses/{warehouse_id}",
        credentials_provider=lambda: cfg.authenticate
    ) as connection:
        with connection.cursor() as cursor:
            cursor.execute(query)
            return cursor.fetchall_arrow().to_pandas()

# Streamlit UI 設定
st.set_page_config(layout="wide")
st.title("🎬 MovieLens 映画評価ビューア")

# データ取得
@st.cache_data(ttl=60)
def load_data():
    movies = sqlQuery("SELECT movieId, title FROM workspace.movielens.movies")
    ratings = sqlQuery("SELECT movieId, rating FROM workspace.movielens.ratings")
    return movies, ratings

movies, ratings = load_data()

# 映画選択
movie_titles = movies['title'].sort_values().tolist()
selected_title = st.selectbox("映画を選んでください", movie_titles)

# 選択された映画の movieId を取得
selected_movie = movies[movies['title'] == selected_title].iloc[0]
movie_id = selected_movie['movieId']

# 該当映画の評価を抽出
movie_ratings = ratings[ratings['movieId'] == movie_id]

# 評価情報の表示
st.subheader(f"📊 『{selected_title}』の評価情報")

if not movie_ratings.empty:
    avg_rating = movie_ratings['rating'].mean()
    rating_count = movie_ratings['rating'].count()

    st.write(f"✅ 平均評価: **{avg_rating:.2f}**")
    st.write(f"✅ 評価数: **{rating_count}**")

    st.write("🧮 評価の分布:")
    st.bar_chart(movie_ratings['rating'].value_counts().sort_index())
else:
    st.warning("⚠️ この映画には評価がありません。")

内容としては、選択された映画の平均評価と評価数を表示し、評価の分布を棒グラフで出力するという簡単なものになっています。

次に app.yaml に、以下のように環境変数として DATABRICKS_WAREHOUSE_ID を登録します。

app.yaml
command: [
  "streamlit", 
  "run",
  "app.py"
]
env:
  - name: 'DATABRICKS_WAREHOUSE_ID'
    value: '<YOUR-WAREHOUSE-ID>'

<YOUR-WAREHOUSE-ID> の部分はご自身の環境に合わせて下さい。

作成したアプリの確認

ファイルの編集が完了したら、再度Appsの画面に戻りデプロイを行います。

0416_dbc_09

再度アプリのURLにアクセスしたところ、以下のように期待した動作が確認できました。

0416_dbc_10

最後に

今回は、Databricks Appsを触ってみました。

参考になりましたら幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.