2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DatabricksにおけるSQL命令型言語のサポート

Last updated at Posted at 2025-03-18

これは嬉しい。

現時点ではDatabricksランタイム16.3がベータ版としてリリースされていますが、こちらではSQL手続き型言語(いわゆるストアドプロシージャ)がサポートされています。

SQL命令型言語のサポート
ANSI SQL/PSMをベースとしたSQLスクリプティングの機能がパブリックプレビューとなりおました。命令型のロジックを実行するためにSQLを使用することができます。これには、制御フローのステートメント、ローカル変数、例外対応が含まれます。SQLスクリプティングの詳細については、SQLスクリプティングをご覧ください。

SQLは取得するデータや作成するテーブルを宣言する宣言型言語です。どのように処理を実行させるのかを命令するCやPythonのような命令型言語のように制御フローを伴う処理の記述は難しく、これまでであれば、Pythonのロジックを含むSQL関数を作成したり、UDF(ユーザー定義関数)を呼び出すなどのアプローチが必要でした。今回のサポートによって、すべてSQLでループや条件分岐のロジックなどを構築することができます。

宣言型と命令型(手続き型)言語の違いはこちらにもまとめられています。

クラスターを作成する際にランタイムで16.3 Betaを選択します。

Screenshot 2025-03-19 at 8.28.31.png

テーブルを作成したりするので、カタログとスキーマを選択します。

%sql
USE takaakiyayoi_catalog.sql_scripting;

動作確認

最低限のBEGINEND構文が動くか確認します。

%sql
BEGIN
END
OK

動きました。

ループ処理

ループを用いてテーブルに0-9の10レコードを挿入します。

%sql
BEGIN
  DECLARE c INT DEFAULT 0;
  CREATE OR REPLACE TABLE t (num INT);
  WHILE c < 10 DO
    INSERT INTO t values (c);
    SET c = c + 1;
  END WHILE;
  SELECT num FROM t ORDER BY num DESC;
END

動きました!

Screenshot 2025-03-19 at 8.35.50.png

Screenshot 2025-03-19 at 8.36.20.png

条件分岐

CASE文を用いた条件分岐を試します。

%sql
BEGIN
    DECLARE choice INT DEFAULT 3;
    DECLARE result STRING;
    CASE choice
      WHEN 1 THEN
        VALUES ('one fish');
      WHEN 2 THEN
        VALUES ('two fish');
      WHEN 3 THEN
        VALUES ('red fish');
      WHEN 4 THEN
        VALUES ('blue fish');
      ELSE
        VALUES ('no fish');
    END CASE;
  END;

choiceが3なのでred fishになるはずです。

Screenshot 2025-03-19 at 8.37.54.png

これも動きました!

複雑な例

アシスタントにコメントをつけてもらいました。2つのテーブルを作成し、レコードを挿入します。configsテーブルはTRUEが入っているので、給与情報を含めてデータを取得するはずです。

%sql
BEGIN
  DECLARE shouldReadSalaryConfig BOOLEAN; -- 給与設定を読み込むかどうかのフラグ
  CREATE OR REPLACE TABLE configs (shouldReadSalary BOOLEAN); -- 設定テーブルの作成
  CREATE OR REPLACE TABLE employees (employeeId INT, name STRING, salary FLOAT); -- 従業員テーブルの作成
  
  INSERT INTO configs VALUES (TRUE); -- 設定テーブルに値を挿入
  INSERT INTO employees VALUES (1, "Peter", 45455.75); -- 従業員データの挿入
  INSERT INTO employees VALUES (2, "Tim", 74223.50);
  INSERT INTO employees VALUES (3, "Steve", 80100.00);
  INSERT INTO employees VALUES (4, "Joey", 105783.00);

  SET shouldReadSalaryConfig = (SELECT shouldReadSalary FROM configs); -- 設定を取得

  IF shouldReadSalaryConfig THEN -- 給与設定を読み込む場合
    SELECT employeeId, name, salary FROM employees ORDER BY employeeId; -- 給与を含む従業員情報を取得
  ELSE -- 給与設定を読み込まない場合
    SELECT employeeId, name from employees ORDER BY employeeId; -- 給与を含まない従業員情報を取得
  END IF;
END

期待通りに動作しました!

employeeId name salary
1 Peter 45455.75
2 Tim 74223.5
3 Steve 80100
4 Joey 105783

SQLの強力なテーブル操作能力と、命令型言語を組み合わせることで、これまで以上に柔軟なデータ操作が可能になります。是非ご活用ください!

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル)をご覧ください。

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

2
3
2

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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?