marimo は、SQL が組み込まれた Python 向けのオープンソースのリアクティブノートブックです。セルを実行したり UI 要素を操作したりすると、marimo は影響を受けるセルを自動的に再実行(または古い状態としてマーク)し、コードと出力の一貫性を保つことで、バグの発生を未然に防ぎます。すべての marimo ノートブックはプレーンな Python コードとして保存され、スクリプトとして実行でき、アプリとしてデプロイできます。
1. SQL サポート付きの marimo をインストールする
pip install "marimo[sql]" clickhouse_connect
marimo edit clickhouse_demo.py
これにより、localhost を開いた Web ブラウザが起動します。
2. ClickHouse への接続
marimo エディタ左側のデータソースパネルを開き、「Add database」をクリックします。
データベースの詳細情報を入力する画面が表示されます。
その後、接続を確立するために実行できるセルが追加されます。
3. SQL を実行する
接続を設定したら、新しい SQL セルを作成し、ClickHouse エンジンを選択できます。
このガイドでは、ニューヨークタクシーのデータセットを使用します。
CREATE TABLE trips (
trip_id UInt32,
pickup_datetime DateTime,
dropoff_datetime DateTime,
pickup_longitude Nullable(Float64),
pickup_latitude Nullable(Float64),
dropoff_longitude Nullable(Float64),
dropoff_latitude Nullable(Float64),
passenger_count UInt8,
trip_distance Float32,
fare_amount Float32,
extra Float32,
tip_amount Float32,
tolls_amount Float32,
total_amount Float32,
payment_type Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5),
pickup_ntaname LowCardinality(String),
dropoff_ntaname LowCardinality(String)
)
ENGINE = MergeTree
PRIMARY KEY (pickup_datetime, dropoff_datetime);
INSERT INTO trips
SELECT
trip_id,
pickup_datetime,
dropoff_datetime,
pickup_longitude,
pickup_latitude,
dropoff_longitude,
dropoff_latitude,
passenger_count,
trip_distance,
fare_amount,
extra,
tip_amount,
tolls_amount,
total_amount,
payment_type,
pickup_ntaname,
dropoff_ntaname
FROM gcs(
'https://storage.googleapis.com/clickhouse-public-datasets/nyc-taxi/trips_0.gz',
'TabSeparatedWithNames'
);
SELECT * FROM trips LIMIT 1000;
これで、結果をデータフレームとして表示できるようになりました。ここでは、特定の pickup ロケーションからの最も高額なドロップオフを可視化してみます。marimo には、そのために役立つ複数の UI コンポーネントが用意されています。この例では、ロケーションの選択にドロップダウンを使用し、チャート描画には altair を使用します。
marimo のリアクティブな実行モデルは SQL クエリにも適用されるため、SQL を変更すると、それに依存するセルの後続計算が自動的に再実行されます(高コストな計算については、オプションでセルを「古い状態」としてマークすることもできます)。そのため、クエリを更新するとチャートとテーブルも更新されます。
また、App View を切り替えることで、データ探索に適したシンプルなインターフェースにすることもできます。