クイック スタート:SQL 機械学習を使用して単純な Python スクリプトを実行する

適用対象: SQL Server 2017 (14.x) 以降 Azure SQL Managed Instance

このクイックスタートでは、SQL Server Machine Learning ServicesAzure SQL Managed Instance Machine Learning ServicesSQL Server ビッグ データ クラスターを使用して、一連の単純な Python スクリプトを実行します。 ストアド プロシージャ sp_execute_external_script を使用して、SQL Server インスタンスでスクリプトを実行する方法について説明します。

前提条件

このクイック スタートを実行するには、次の前提条件を用意しておく必要があります。

単純なスクリプトを実行する

Python スクリプトを実行するには、これを引数としてシステム ストアド プロシージャ sp_execute_external_script に渡します。 このシステム ストアド プロシージャを使用して、SQL 機械学習のコンテキストで Python ランタイムを起動し、データを Python に渡し、Python ユーザー セッションを安全に管理し、何らかの結果をクライアントに返します。

以降の手順では、次に例示する Python スクリプトをデータベースで実行します。

a = 1
b = 2
c = a/b
d = a*b
print(c, d)
  1. SQL インスタンスに接続された Azure Data Studio で新しいクエリ ウィンドウを開きます。

  2. 完全な Python スクリプトを sp_execute_external_script ストアド プロシージャに渡します。

    このスクリプトは、@script 引数を通して渡されます。 @script 引数内のすべては、有効な Python コードである必要があります。

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    '
    
  3. 正しい結果が計算され、Python print 関数によって Messages ウィンドウに結果が返されます。

    次のように表示されます。

    結果

    STDOUT message(s) from external script:
    0.5 2
    

Hello World スクリプトを実行する

一般的なスクリプトの例では、文字列 "Hello World" が出力されるだけです。 次のコマンドを実行します。

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'OutputDataSet = InputDataSet'
    , @input_data_1 = N'SELECT 1 AS hello'
WITH RESULT SETS(([Hello World] INT));
GO

sp_execute_external_scriptストアド プロシージャへの入力は次のとおりです。

入力 説明
@language 呼び出す言語拡張機能 (この例では Python) を定義します
@script Python ランタイムに渡されるコマンドを定義します Python 全体は、Unicode テキストとして、この引数で囲まれている必要があります。 nvarchar 型の変数にテキストを追加して、その変数を呼び出すこともできます
@input_data_1 クエリによって返されるデータ。Python ランタイムに渡され、そこからデータがデータ フレームとして返されます
結果セットを含む 句では、SQL 機械学習に対して返されるデータ テーブルのスキーマを定義し、列名として "Hello World" を追加し、データ型に int を追加します

このコマンドは、次のテキストを出力します。

Hello World
1

入力と出力を使用する

既定では、sp_execute_external_script は 1 つのデータセットを入力として受け入れます。通常は、有効な SQL クエリの形式で指定します。 次に、1 つの Python データ フレームを出力として返します。

ここでは、sp_execute_external_script の既定の入力変数と出力変数を使用します。InputDataSet および OutputDataSet

  1. テスト データの小さなテーブルを作成します。

    CREATE TABLE PythonTestData (col1 INT NOT NULL)
    
    INSERT INTO PythonTestData
    VALUES (1);
    
    INSERT INTO PythonTestData
    VALUES (10);
    
    INSERT INTO PythonTestData
    VALUES (100);
    GO
    
  2. テーブルのクエリを実行するには、SELECT ステートメントを使用します。

    SELECT *
    FROM PythonTestData
    

    結果

    PythonTestData テーブルの内容

  3. 次の Python スクリプトを実行します。 SELECT ステートメントを使用してテーブルからデータを取得し、それを Python ランタイムを介して渡し、データをデータ フレームとして返します。 WITH RESULT SETS 句では、SQL に対して返されたデータ テーブルのスキーマを定義して、列名 NewColName を追加します。

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'OutputDataSet = InputDataSet;'
        , @input_data_1 = N'SELECT * FROM PythonTestData;'
    WITH RESULT SETS(([NewColName] INT NOT NULL));
    

    結果

    テーブルからデータを返す Python スクリプトからの出力

  4. 次に、入力変数と出力変数の名前を変更します。 既定の入力変数名と出力変数名は InputDataSetOutputDataSet で、次のスクリプトによって名前が SQL_in および SQL_out に変更されます。

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'SQL_out = SQL_in;'
        , @input_data_1 = N'SELECT 12 as Col;'
        , @input_data_1_name  = N'SQL_in'
        , @output_data_1_name = N'SQL_out'
    WITH RESULT SETS(([NewColName] INT NOT NULL));
    

    Python では大文字と小文字が区別されることに注意してください。 Python スクリプトで使用される入力変数と出力変数は (SQL_outSQL_in)、大文字と小文字を区別して、@input_data_1_name@output_data_1_nameで定義されている名前と一致する必要があります。

    ヒント

    パラメーターとして渡すことができる入力データセットは 1 つだけです。また、返すことのできるデータセットも 1 つだけです。 ただし、Python コード内から他のデータセットを呼び出し、データセットに加えて他の型の出力を返すことができます。 任意のパラメーターに OUTPUT キーワードを追加することもでき、その場合は、パラメーターに結果が返されます。

  5. 入力データを含まない Python スクリプトを使用して値を生成することもできます (@input_data_1 は空白に設定されます)。

    次のスクリプトは、 "hello" と "world" というテキストを出力します。

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    import pandas as pd
    mytextvariable = pandas.Series(["hello", " ", "world"]);
    OutputDataSet = pd.DataFrame(mytextvariable);
    '
        , @input_data_1 = N''
    WITH RESULT SETS(([Col1] CHAR(20) NOT NULL));
    

    結果

    <span class=@script as input" /> を使用したクエリ結果

ヒント

Python では、先頭のスペースを使用してステートメントをグループ化します。 そのため、前述のスクリプトのように、埋め込まれた Python スクリプトが複数の行にまたがる場合は、SQL コマンドに合わせるために Python コマンドにインデントを設定しようとしないでください。 たとえば、次のスクリプトではエラーが生成されます。

EXECUTE sp_execute_external_script @language = N'Python'
      , @script = N'
      import pandas as pd
      mytextvariable = pandas.Series(["hello", " ", "world"]);
      OutputDataSet = pd.DataFrame(mytextvariable);
      '
      , @input_data_1 = N''
WITH RESULT SETS(([Col1] CHAR(20) NOT NULL));

Python バージョンの確認

サーバーにインストールされている Python のバージョンを確認するには、次のスクリプトを実行します。

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'
import sys
print(sys.version)
'
GO

Python print 関数は、Messages ウィンドウにバージョンを返します。 次の出力例では、この場合、Python バージョン 3.5.2 がインストールされていることが分かります。

結果

STDOUT message(s) from external script:
3.5.2 |Continuum Analytics, Inc.| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]

Python パッケージを一覧表示します

Microsoft では、SQL Server 2016 (13.x)、SQL Server 2017 (14.x)、および SQL Server 2019 (15.x) で、Machine Learning Services と共にプレインストールされた多数の Python パッケージを提供しています。 SQL Server 2022 (16.x) では、必要に応じて任意のカスタム Python ランタイムとパッケージをダウンロードし、インストールできます。

バージョンなど、インストールされている Python パッケージの一覧を表示するには、次のスクリプトを実行します。

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'
import pkg_resources
import pandas
dists = [str(d) for d in pkg_resources.working_set]
OutputDataSet = pandas.DataFrame(dists)
'
WITH RESULT SETS(([Package] NVARCHAR(max)))
GO

この一覧は Python の pkg_resources.working_set からのものであり、データ フレームとして SQL に返されます。

次のステップ

SQL 機械学習で Python を使用する場合のデータ構造の使用方法については、次のクイックスタートを参照してください。