メインコンテンツへジャンプ
Engineering blog

本日は、SQL関数で名前付き引数を利用できるようになったことを紹介します。 この機能を使えば、より柔軟な方法で関数を呼び出すことが可能になります。 このブログでは、まずこの機能がどのようなものかを紹介し、次にSQLユーザー定義関数(UDF)のコンテキストで何ができるかを示し、最後に組み込み関数でどのように機能するかを探ります。 まとめると、名前付き引数はSQLのヘビーユーザーにとってもライトユーザーにとっても、作業を容易にする新しい便利な方法です。

名前付き引数とは何か?

多くのプログラミング言語では、関数定義に1つ以上の引数のデフォルト値を含めることができます。 例えば、Pythonでは次のようなメソッドを定義できます:

def botw(x, y = 6, z = 7): return x * y + z

ユーザーがこの機能を呼び出したい場合、次のように選択できます:

botw(5, z = 8)

これはキーワード引数の例で、パラメータ名と対応する引数値を関連付けてパラメータを代入します。 関数呼び出しの柔軟な形式ですう。 これは、特定のパラメータがオプショナルであったり、関数のパラメータが大量に存在する場合に特に有効です。

本日、Apache Spark 3.5とDatabricks Runtime 14.1のSQL言語に同様の構文が追加されたことを発表します。

以下に例を示すと:

SELECT sql_func(5, paramA => 6);

この構文では、等号の代わりに「太い矢印」記号(=> )を使います。 この名前付き引数 paramA => 6は、Pythonの関数呼び出しではz = 8と等価です。 この構文を確立したところで、次にSQL関数のさまざまなタイプについて、この構文がどのように機能するかを考えてみましょう。

SQL UDFで名前付き引数を使う

Introducing SQL User-Defined Functionsから、Databricks SQL UDFsに新たに導入された名前付き引数を見てみましょう。 Power to the SQL People で説明されているように、ユーザが Python ルーチンをプラグインして SQL 関数として登録することも可能です:Databricks SQLにおけるPython UDFの導入で説明されています。 今日、これらのUDFはDatabricksユーザーのアプリケーションのいたるところで使用されています。

本日発表した名前付き引数の新しいサポートは、前述の組み込み関数のサポートと一貫しています。 次のSQL文でユーザー定義関数を作成する例を見てみよう:

CREATE FUNCTION henry_stickman(x INT, y INT DEFAULT 6, z INT DEFAULT 8)
RETURN x * y * y + z;

マスク関数の場合と同じように、次のように呼び出すことができます:

SELECT henry_stickman(7, z => 9);

> 261

これは、入力パラメータ・リストが長くなるようなUDFでは非常に便利です。 この機能により、SQLユーザーは関数の呼び出し時に、位置によってすべての値を列挙する代わりに、いくつかの値だけを指定することができます。 ここでは、すべてのSQL UDF定義がユーザー指定の引数名を含むという事実を利用することができます。

Spark 組み込み SQL 関数で名前付き引数を使用する

この機能はApache Sparkでも機能します。 例えば、マスクSQL関数には5つの入力パラメータがあり、最後の4つはオプションです。 これらのパラメータは、位置順に名前が付けられています:

  1. str(文字列、必須)
  2. upperChar(文字列、オプション)
  3. lowerChar(文字列、オプション)
  4. digitChar (文字列、オプション)
  5. otherChar(文字列、オプション)

マスクSQL関数を呼び出すには、次のような呼び出しを使用します。 ここでは、digitCharの引数の割り当てを変更し、他のオプション・パラメーターは同じ値を保持するようにしたいです。 位置引数のみがサポートされている言語では、呼び出し構文は次のようになります:

SELECT mask('Lord of the 42 rings', NULL, NULL, '9', NULL);

> Lord of the 99 rings

デフォルト値が存在することがわかっていても、他のオプション・パラメーターの引数を指定しなければならないからです。 ここで明らかになったのは、関数のパラメータ・リストを数百に拡大すると、リストの後半にある1つのパラメータを変更するために、以前のパラメータ値を数多く列挙することがばかばかしくなるということです。

名前付き引数を使えば、すべてが変わる。 次の構文が使えるようになりました:

SELECT mask('Lord of the 42 rings', digitChar =>'9');

> Lord of the 99 rings

キーワード引数を使えば、パラメータ名digitCharを指定し、値dを代入するだけで処理できます。 つまり、digitCharの前の位置にあるオプション・パラメーターの値を列挙する必要がなくなっったということです。 さらに、より読みやすいコードと簡潔な関数呼び出しが可能になりました。

名前付き引数は Databricks 組み込み関数でも動作します。

名前付き引数は、Databricks Runtime 14.1 で導入された多くの SQL 関数の重要な構成要素となっています。

例えば、read_filesという関数がありますが、これは定義可能なコンフィギュレーションのリストが長いため、何百ものパラメーターを持っています(ドキュメントを参照)。 その結果、いくつかのパラメータはオプションとなり、名前付き引数を使って値を代入しなければなりません。

その他にも、名前付き引数をサポートするSQL関数が複数実装されています。 この過程で、キーワード引数を使用した値の割り当てが情報を指定する唯一の合理的な方法である状況を見つけました。

結論:名前付き関数はあなたの人生をより良くする

この機能により、多くのSQLユースケースでQOLが向上し、使い勝手が向上します。 これにより、ユーザーは関数を作成し、後で簡潔で読みやすい方法で呼び出すことが可能になりました。 また、この機能がDatabricks Runtimeで現在進行中の多くの取り組みにとって、いかに重要なインフラであるかを示します。 名前付き引数のサポートは不可欠な機能であり、現在も将来も、さまざまなタイプの関数を簡単に書いたり呼び出したりできるようになります。 名前付き引数は Databricks Runtime 14.1 以降と Apache Spark 3.5 で利用可能です。

Enjoy, and happy querying!

Databricks 無料トライアル

関連記事

Platform blog

Introducing SQL User-Defined Functions

A user-defined function (UDF) is a means for a user to extend the native capabilities of Apache Spark™ SQL. SQL on Databricks has...
Platform blog

Power to the SQL People: Introducing Python UDFs in Databricks SQL

We were thrilled to announce the preview for Python User-Defined Functions (UDFs) in Databricks SQL (DBSQL) at last month's Data and AI Summit...
エンジニアリングのブログ一覧へ