OMOP Odyssey - Databricks AI/BI Genie を使ってノーコードでCDM検索(アイオロス島編)
.png)
Databricks Genie と InterSystems OMOP によるノーコード Text-to-SQL
OHDSI の世界には、Atlas、Achiles、DQD、ShinyApp、OMOPSketch、さらにダイアレクト間の翻訳に役立つ有名な SQLRender(IRIS ダイアレクトもサポートされました)など、インサイトを表面化できる非常に強力なクエリの記述支援を行えるツールが多数あります。 気が遠くなる上、非常に不完全なリストです。しかし、このコミュニティを学ぶためのツールを精査したところ、いわゆる自然言語を SQL に翻訳するものは見つからなかったため、Databricks AI/BI Genie を試してみました。ここに、最初の結果の一部を示します。.png)
Databricks のワークスペースのセットアップ
私の計算クラスターは非常にシンプルで、InterSystems JDBC ドライバーがボリューム経由で含められて接続されています。バージョンに関しては少し遅れていますが、3.7.1 では問題なく動作しました。
.png)
次に、クラスターの起動時に実行する初期化スクリプトが必要です。これは前の記事でいくつかの場所に使用していましたが、もう一度そのダイレクトリンクを示しておきます: import_cloudsql_certfiicate.sh。基本的に、InterSystems OMOP ポータルから証明書を貼り付けて、スクリプトをボリュームにマウントし、以下のように起動時に実行するように設定します。起動時に、環境がデータベースセキュリティに接続するはずです。
.png)
OMOP からカタログへの ELT
テーブル間の抽出ロード変換は、ノートブックを使用して、以前にロードした InterSystems OMOP CDM 内の母集団に対して実行されました。パイプラインの実行には約 1 時間かかりますが、正直なところ、私はかなりケチなので、Personal Compute を使用してこの作業を完了しました。drug_exposure テーブルに最も時間がかかったようなので、ノートブックの予約語衝突 `DOMAIN` 👣🔫 の回避策に注意してください。これにより、OMOP データベーススキーマの OMOPCDM54 が、同じ名前のカタログスキーマにリッピングされます。.png)
スクリーンショットが邪魔にならないように、以下のティーザーに Python を含めておきました。
%python
cdmtables = ["care_site", "cdm_source", "cohort", "cohort_definition", "concept", "concept_ancestor", "concept_class", "concept_relationship", "concept_synonym", "condition_era", "condition_occurrence", "cost", "death", "device_exposure", "domain", "dose_era", "drug_era", "drug_exposure", "drug_strength", "episode", "episode_event", "fact_relationship", "location", "measurement", "metadata", "note", "note_nlp", "observation", "observation_period", "payer_plan_period", "person", "procedure_occurrence", "provider", "relationship", "source_to_concept_map", "specimen", "visit_detail", "visit_occurrence", "vocabulary"]
for table in cdmtables:
try:
if table == "domain":
sql = f'(select * from OMOPCDM54."{table}") AS temp_table;'else:
sql = f'(select * from OMOPCDM54.{table}) AS temp_table;'
table = f'omopcdm54.iccastage.{table}'
df_table = (spark.read
.format("jdbc")
.option("url", "jdbc:IRIS://k8s-0a6bc2ca-adb040ad-c7bf2ee7c6-e6b05ee242f76bf2.elb.us-east-1.amazonaws.com:443/USER")
.option("driver", "com.intersystems.jdbc.IRISDriver")
.option("user", "SQLAdmin")
.option("dbtable", sql)
.option("sql", "SELECT * FROM temp_table;")
.option("password", "REDACTED")
.option("connection security level", "10")
.option("sslConnection", "true")
.load())
df_table.write.saveAsTable(table)
#location = f"s3a://databricks-swap/omopcsv/{table}"#df_table.write.csv()# df.write.option("header", "true").csv("path/to/output_directory")# df_table.write.option("header", "true").csv(location,mode="overwrite")
print(f"Table/S3 {table} written successfully.")
except Exception as e:
print(f"Error processing table {table}: {e}")
不要な画像かもしれませんが、含めておきました。.png)
Databricks Genie AI/BI
はじめて Genie を使用するには専門知識はいらなかったようです。結局のところ、「ポイントしてプロンプト」の方法で行えます。そして、何かをアサートしたり、追加のクエリで学習したり、サンプルの質問を提供したり、Genie に動作方法を指示したりする機能を備えています...
.png)
さぁ、願い事をしましょう
Genie AI/BI のセールスポイントかはさておき、それを使って早速最初の質問を投じてみましょう。非常にシンプルです。
医療機関はいくつありますか?
.png)
では、デプロイメントと照合してみましょう。
.png)
特に衝撃的なことではありませんが... 確かにクエリを正しく行い、カウントは結果と同じように正確に得られました。
データベース内の性別の分布をパイチャートで示してください。
.png)
よく描かれています。
これは、実際の例のリポジトリにある OMOP クエリテキストの抜粋です。
データベース内で 365 日以上の観察期間が 1 つ以上適用されている人の数をカウントしてください。
.png)
これについては、例に示されているテキストとコードのスタイルの違いを見ることに興味がありました...
| Databricks Genie | OMOPクエリの例 |
| |
スタイルに差があり、スキーマの場所も異なりますが、基本的に同じ結果を得られました。
これは「単なる CDM」であり、そうであれば非常におもしろかっただろう「CDM の結果」ではないので、特に興味が湧くことではありませんが、結果に到達するには、OHDSI コミュニティツールに戻る必要があることに注意しておきましょう。