Выполнения Python, с помощью T-SQL

python > Выполнения Python, с помощью T-SQL
27.04.2018 15:48:29



Статья:

Убедитесь, что включена Python и панели запуска выполняется

  1. В среде Management Studio выполните следующую инструкцию, чтобы убедиться в том, что включена служба.

    SQL
    sp_configure ''external scripts enabled''
    

    Если run_value -1, средство обучения машины, установленных и готова к использованию.

    Распространенной причиной ошибки является остановку управляет связью между SQL Server и Python, панели запуска. Можно просмотреть состояние запуска с помощью Windows служб панели или путем открытия диспетчера конфигурации SQL Server. Если данная служба остановлена, перезапустите его.

  2. Далее убедитесь, что среда выполнения Python работа и взаимодействие с SQL Server.Чтобы сделать это, откройте новый запроса окна в SQL Server Management Studio и подключитесь к экземпляру, где установлен Python.

    SQL
    EXEC sp_execute_external_script @language = N''Python'', 
    @script = N''print(3+4)''
    

    Если все хорошо, вы увидите результат сообщение, похожее на следующее

    text
    STDOUT message(s) from external script: 
    7
    
  3. Если возникли ошибки, существует несколько вещей, которые можно сделать, чтобы убедиться, что сервер и Python может обмениваться данными.

    Необходимо добавить группу пользователей Windows SQLRUserGroup как имя входа на экземпляре, чтобы убедиться, что панель запуска могут обеспечивать взаимодействие между Python и SQL Server. (Той же группе используется для обоих R и выполнение кода Python). Дополнительные сведения см. в разделе неявной проверки подлинности включен.

    Кроме того может потребоваться включить сетевые протоколы, которые были отключены, или открыть брандмауэр, чтобы SQL Server могли взаимодействовать с внешними клиентами. Дополнительные сведения см. в разделе Устранение неполадок при установке.

Основные взаимодействия Python

Существует два способа для выполнения кода Python в SQL Server:

  • Добавить скрипт на Python в качестве аргумента системной хранимой процедурыsp_execute_external_script
  • Подключиться к SQL Server с удаленного клиента Python и выполнение кода с помощью SQL Server в контексте. Для этого необходимо revoscalepy.

Основная цель данного руководства — убедитесь, что при использовании Python в хранимой процедуре.

  1. Выполните определенный простой код, чтобы увидеть, какие данные передаются назад и вперед между SQL Server и Python.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    ''
    
  2. При условии, что у вас есть все настроено правильно и Python и SQL Server взаимодействуют друг с другом, вычисляется правильный результат и Python printфункция возвращает результат в сообщений windows.

    Результаты

    text
    STDOUT message(s) from external script: 
    0.5 2
    

    При получении stdout сообщений находится под рукой при проверке кода, более часто необходимо возвращать результаты в табличном формате, можно использовать его в приложении или запись в таблицу.

На данном этапе Запомните следующие правила:

  • Весь код внутри @script аргумент должен быть допустимым кодом Python.
  • Код необходимо соблюдать все правила Pythonic отношении отступы, имена переменных и т. д. При возникновении ошибки, проверьте, пробелы и регистр символов.
  • При использовании все библиотеки, которые не загружаются по умолчанию, необходимо использовать инструкцию импорта в начале скрипта для их загрузки.
  • Если библиотека еще не установлена, остановите и установить пакет Python вне SQL Server, как описано здесь: установить новые пакеты Python на сервере SQL Server

Входы и выходы

По умолчанию sp_execute_external_script принимает один входной набор данных, которая обычно предоставляется в виде SQL-запроса. Другие типы входных данных, которые могут быть переданы как переменные SQL: например, можно передать обученной модели как переменную, например с помощью функции сериализации pickle или rx_serialize_model для записи модели двоичный формат.

Хранимая процедура возвращает один Python pandas кадра данных в качестве выходных данных. Однако можно выводить скалярных величин и модели как переменные. Например можно выходные обученной модели как переменная двоичных и передать его инструкцию T-SQL INSERT для записи в таблицу модели. Также можно создавать диаграммы (в двоичном формате) или скалярных величин (отдельных значений, таких как дата и время, затраченное время обучения модели и так далее).

Теперь давайте рассмотрим только значение по умолчанию входных и выходных переменных, InputDataSet и OutputDataSet.

  1. Выполните следующий код, чтобы выполнять некоторые математические операции и выводить результаты.

     ```sql
     execute sp_execute_external_script 
     @language = N''Python'', 
     @script = N''
     a = 1
     b = 2
     c = a/b
     print(c)
     OutputDataSet = c
     ''
     WITH RESULT SETS ((ResultValue float))
     ```
    
  2. Должно появиться ошибку, так как скаляр, не кадр данных приводит к возникновению в коде Python.

     **Results**
    
     ```text
     line 43, in transform
         raise TypeError(''OutputDataSet should be of type pandas.DataFrame'')
     ```
    
  3. Теперь посмотрим, что произойдет при передаче набор табличных данных в Python, с помощью входной переменной по умолчанию InputDataSet.

    SQL
    EXECUTE sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    OutputDataSet = InputDataSet
    '',
    @input_data_1 = N''SELECT 1 as Col1''
    

    Хранимая процедура возвращает data.frame автоматически, без необходимости выполнять дополнительные в коде Python.

    Результаты

    Нет columnname
    1

    По умолчанию одной табличной входного набора данных с именем, InputDataSet. Тем не менее, это имя можно изменить, добавив строку, аналогичную следующей: @input_data_1_name = N''myResultName''.

    Имена столбцов, используемых Python никогда не сохраняются в выходных данных.Несмотря на то, что входящий запрос заданное имя столбца Col1, что имя не возвращается ни бы все заголовки столбцов, используемых сценарий Python. Чтобы указать тип столбца имени и данных после возврата данных в SQL Server, используйте T-SQL WITH RESULT SETS предложения.

  4. Этот пример содержит новые имена для входных и выходных переменных.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    MyOutput = MyInput
    '',
    @input_data_1_name = N''MyInput'',
    @input_data_1 = N''SELECT 1 as Col1'',
    @output_data_1_name = N''MyOutput''
    WITH RESULT SETS ((ResultValue int))
    

    Предложение с РЕЗУЛЬТИРУЮЩИЙ НАБОР определяет схему для выходных данных, так как имена столбцов Python с data.frame никогда не возвращаются.

    Результаты

    ResultValue
    1
  5. Теперь давайте рассмотрим типичную ошибку Python. Изменение строки в приведенном выше примере на @input_data_1_name = N''MyInput'' для @input_data_1_name = N''myinput''.

    Ошибки Python передаются вам как сообщения, по вспомогательной службы, используемый сервером SQL Server. Сообщения могут быть длинными и включают ошибки SQL Server или ошибки запуска вместе с ошибками Python, поэтому наберитесь терпения в анализировать данные по тексту. Ключ сообщения — в этой строке:

    text
    MyOutput = MyInput
    NameError: name ''MyInput'' is not defined
    

    Помните, что Python, например R, с учетом регистра. Таким образом при возникновении любых ошибок, не забудьте проверить ваш имена переменных и поиск проблем с типами данных, отступов и интервала.

Структуры данных Python

SQL Server использует Python pandas пакет, который отлично подходит для работы с табличными данными. Тем не менее вы уже видели нельзя передать скалярного из Python в SQL Server и ожидают, что он «просто будет работать». В этом разделе мы рассмотрим некоторые определения типов данных, для подготовки к дополнительные проблемы, которые могут выполняться между при передаче табличных данных между Python и SQL Server.

  • Кадр данных — это таблица с нескольких столбцов.
  • Один столбец кадр данных, является объект как список с именем ряда.
  • Одно значение — это ячейка кадра данных и должна быть вызвана по индексу.

Так как бы вы предоставляют один результат вычисления как кадра данных, если data.frame требует табличной структуры? Одно скалярное значение как ряд, который легко преобразовать в кадр данных должен быть представлен один ответ.

  1. В этом примере не некоторых простых вычислений и преобразует скалярного в последовательности. Ряд требуется индекс, который можно назначить вручную, как показано ниже, или программно.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    a = 1
    b = 2
    c = a/b
    print(c)
    s = pandas.Series(c, index =["simple math example 1"])
    print(s)
    ''
    
  2. Поскольку ряды еще не были преобразованы в data.frame, возвращаются значения в окне сообщения, но можно увидеть, что результаты в формате более таблицы.

    Результаты

    text
    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    dtype: float64
    
  3. К длине ряда, можно добавить новые значения с помощью массива.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    ''
    

    Если индекс не указан, создается индекс, содержащий значения, начиная с 0 и заканчивая длину массива.

    Результаты

    text
    STDOUT message(s) from external script: 
    0    0.5
    1    2.0
    dtype: float64
    
  4. Если увеличить число индекса значения, но не добавлять новые данных значения, повторяющихся значений данных для заполнения ряда.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    a = 1
    b = 2
    c = a/b
    s = pandas.Series(c, index =["simple math example 1", "simple math example 2"])
    print(s)
    ''
    

    Результаты

    text
    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    simple math example 2    0.5
    dtype: float64
    

Преобразовать ряда кадра данных.

Математические скалярные результаты преобразуется в табличную структуру, по-прежнему нужно преобразовать их в формат, который может обрабатывать SQL Server.

  1. Чтобы преобразовать последовательность data.frame, вызовите pandas кадр данныхметод.

    SQL
    execute sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    df = pd.DataFrame(s)
    OutputDataSet = df
    ''
    WITH RESULT SETS (( ResultValue float ))
    
  2. Обратите внимание, что значения индекса не выводятся, даже если индекс используется для получения определенных значений из data.frame.

    Результаты

    ResultValue
    0,5
    2

Выходные значения в data.frame, использование индекса

Давайте посмотрим, как работает преобразование data.frame с наших двух рядов, содержащий результаты простой математических операций. Первый имеет индекс последовательные значения, созданные Python. Вторая использует произвольный индекса строковых значений.

  1. В этом примере возвращает значение из серии, использующий целочисленного индекса.

    SQL
    EXECUTE sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    df = pd.DataFrame(s, index=[1])
    OutputDataSet = df
    ''
    WITH RESULT SETS (( ResultValue float ))
    

    Помните, что автоматически созданный индекс начинается с 0. Попробуйте использовать вне диапазона значения индекса и посмотрим, что произойдет.

  2. Теперь давайте получают одно значение из других кадров данных с индексом строки.

    SQL
    EXECUTE sp_execute_external_script 
    @language = N''Python'', 
    @script = N''
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    s = pandas.Series(c, index =["simple math example 1", "simple math example 2"])
    print(s)
    df = pd.DataFrame(s, index=["simple math example 1"])
    OutputDataSet = df
    ''
    WITH RESULT SETS (( ResultValue float ))
    

    Результаты

    ResultValue
    0,5

    Если вы попытаетесь использовать числовой индекс для получения значения из этой серии, возникает сообщение об ошибке.

В этом упражнении был предназначен для дают общее представление о работе с разной структурой данных Python и убедитесь, что получение правильного результата в виде блока данных. Может завершения, выводя одно значение как кадра данных есть несколько проблем, чем его за! К счастью можно легко передать все типы значений и из него хранимой процедуры как переменные. Рассматривается в следующем разделе.

Советы

  • Среди языков программирования Python является одним из наиболее гибкий по отношению к одинарные или двойные кавычки. они во многом взаимозаменяемыми.

    Тем не менее, T-SQL используются одинарные кавычки для только определенных операций и @script аргумент используются одинарные кавычки для заключения в них код Python как строка Юникода. Таким образом может потребоваться коде Python и изменить некоторые одинарные кавычки, двойные кавычки.

  • Не удалось найти хранимую процедуру sp_execute_external_script? Это означает, что вы, возможно, не была завершена настройка экземпляра для поддержки выполнения внешнего сценария. После запуска программы установки SQL Server 2017 г. и выбора Python как машинного обучения язык, необходимо явным образом включить функции с помощью sp_configure, а затем перезапустите экземпляр.

    Дополнительные сведения см. в разделе установки служб SQL Server 2017 г машины обучения (в базе данных).