1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DatabricksAdvent Calendar 2024

Day 23

Databricksノートブックで混在する言語間の変数の共有

Posted at

Databricksのノートブックは、一つのノートブックの中にPython、SQL、シェルなどを混在させることができます。大規模開発であればジョブ化したり、言語ごとのノートブックを作成して連携させることも可能ですが、それほど規模が大きくなく、かつ、ある箇所はSQL、別の箇所ではPythonで処理をしたいといったケースでは便利な機能です。

そして、複数言語が混在しているノートブックがある際に必要になってくるのが変数の共有です。Pythonの処理結果をSQLやシェルから参照したい場合にどうしたらいいのでしょうか。過去に以下の記事を書いていますが、今回はPythonからSQLの変数へのアクセスやシェルも含めてウォークスルーしていきます。

なお、こちらの記事ではRなど他の言語との変数の共有方法についてもカバーされています。

この記事で言いたいことを図にまとめると以下のようになります。

Screenshot 2024-12-23 at 13.12.12.png

SQLからPython変数へのアクセス

Sparkパラメーターによるアクセス

いくつかアプローチがありますが、推奨はspark.conf.setを用いたSparkパラメーターによるものとなります。

# Pythonセル
import datetime

x = str(datetime.date.today())
x
'2024-12-23'
spark.conf.set('v.max_date', x)
%sql
-- SQLセル
SELECT "${v.max_date}" AS max_date

Screenshot 2024-12-23 at 11.47.14.png

SQL変数経由でのアクセス

SQL変数経由でも引き渡し可能です。

# Pythonセル
my_var = 5
spark.sql("DECLARE OR REPLACE my_var INT")
spark.sql(f"SET VAR my_var = {my_var}")
%sql
-- SQLセル
SELECT my_var

Screenshot 2024-12-23 at 11.56.01.png

ウィジェット経由でのアクセス

ウィジェット経由でもアクセスできますが、こちらの制限事項にあるように、RUN ALLした際やジョブにした際、期待した通りに動作しないリスクがあります。インタラクティブに実行する際にはこちらでも問題ありません。

dbutils.widgets.text("max_date", x)
%sql
-- SQLセル
select getArgument("max_date") AS max_date -- SQLのgetArgument関数は廃止され、DBR 17.0以降では削除されます。

select "${max_date}" AS max_date -- パラメーターマーカーへの移行が推奨されています

select :max_date AS max_date -- パラメーターマーカーによるウィジェット変数へのアクセス

Screenshot 2024-12-23 at 11.50.28.png

SQLからPythonのSparkデータフレームへのアクセス

これは一時ビューを使うのが簡単です。

# Pythonセル
df = spark.createDataFrame([(1, 'Alice'), (2, 'Bob')], ['id', 'name'])
df.createOrReplaceTempView("people")
%sql
-- SQLセル
SELECT * FROM people

Screenshot 2024-12-23 at 13.01.57.png

PythonからSQLへのアクセス

ノートブックでSQLを実行すると、その結果は暗黙的に作成されるデータフレーム_sqldfに格納されますので、そちらにアクセスします。

%sql
SELECT
  count(*) as count
FROM
  users.takaaki_yayoi.covid_cases;

Screenshot 2024-12-23 at 12.02.15.png

# Pythonセル
pdf = _sqldf.toPandas()
pdf["count"][0]
23171

シェルからPython変数へのアクセス

Databricksノートブックでは、%shマジックコマンドで、クラスターのドライバーノード上のシェルにアクセスすることができます。こちらで説明されているように、環境変数経由でシェルからPythonの変数にアクセスできます。

# Pythonセル
import os
l =['A','B','C','D']
os.environ['LIST']=' '.join(l)
print(os.getenv('LIST'))
%sh
# シェルのセル
for i in $LIST
do
  echo $i
done
A
B
C
D

Pythonからシェル変数へのアクセス

逆方向での直接的な方法はサポートされていないので、こちらにあるようにファイル経由となります。ドライバーノードのローカルストレージに変数を書き込んだファイルを出力します。

%sh
# シェルのセル
echo "my_value" >/tmp/foo
# Pythonセル
from pathlib import Path
my_var = Path("/tmp/foo").read_text()
print(my_var)
my_value

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?