python > Выполнения Python, с помощью T-SQL
27.04.2018 15:48:29
Наиболее часто встречающиеся слова в статье:
[sp_execute_external_script] [language] [N''Python''] [example] [Результаты] [значения] [запуска] [SQLexecute] [значение] ["simple]
Статья:
Убедитесь, что включена Python и панели запуска выполняется
-
В среде Management Studio выполните следующую инструкцию, чтобы убедиться в том, что включена служба.
SQLsp_configure ''external scripts enabled''
Если run_value -1, средство обучения машины, установленных и готова к использованию.
Распространенной причиной ошибки является остановку управляет связью между SQL Server и Python, панели запуска. Можно просмотреть состояние запуска с помощью Windows служб панели или путем открытия диспетчера конфигурации SQL Server. Если данная служба остановлена, перезапустите его.
-
Далее убедитесь, что среда выполнения Python работа и взаимодействие с SQL Server.Чтобы сделать это, откройте новый запроса окна в SQL Server Management Studio и подключитесь к экземпляру, где установлен Python.
SQLEXEC sp_execute_external_script @language = N''Python'', @script = N''print(3+4)''
Если все хорошо, вы увидите результат сообщение, похожее на следующее
textSTDOUT message(s) from external script: 7
-
Если возникли ошибки, существует несколько вещей, которые можно сделать, чтобы убедиться, что сервер и 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 в хранимой процедуре.
-
Выполните определенный простой код, чтобы увидеть, какие данные передаются назад и вперед между SQL Server и Python.
SQLexecute sp_execute_external_script @language = N''Python'', @script = N'' a = 1 b = 2 c = a/b d = a*b print(c, d) ''
-
При условии, что у вас есть все настроено правильно и Python и SQL Server взаимодействуют друг с другом, вычисляется правильный результат и Python
print
функция возвращает результат в сообщений windows.Результаты
textSTDOUT 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
.
-
Выполните следующий код, чтобы выполнять некоторые математические операции и выводить результаты.
```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)) ```
-
Должно появиться ошибку, так как скаляр, не кадр данных приводит к возникновению в коде Python.
**Results** ```text line 43, in transform raise TypeError(''OutputDataSet should be of type pandas.DataFrame'') ```
-
Теперь посмотрим, что произойдет при передаче набор табличных данных в Python, с помощью входной переменной по умолчанию
InputDataSet
.SQLEXECUTE 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-SQLWITH RESULT SETS
предложения. -
Этот пример содержит новые имена для входных и выходных переменных.
SQLexecute 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 -
Теперь давайте рассмотрим типичную ошибку Python. Изменение строки в приведенном выше примере на
@input_data_1_name = N''MyInput''
для@input_data_1_name = N''myinput''
.Ошибки Python передаются вам как сообщения, по вспомогательной службы, используемый сервером SQL Server. Сообщения могут быть длинными и включают ошибки SQL Server или ошибки запуска вместе с ошибками Python, поэтому наберитесь терпения в анализировать данные по тексту. Ключ сообщения — в этой строке:
textMyOutput = MyInput NameError: name ''MyInput'' is not defined
Помните, что Python, например R, с учетом регистра. Таким образом при возникновении любых ошибок, не забудьте проверить ваш имена переменных и поиск проблем с типами данных, отступов и интервала.
Структуры данных Python
SQL Server использует Python pandas пакет, который отлично подходит для работы с табличными данными. Тем не менее вы уже видели нельзя передать скалярного из Python в SQL Server и ожидают, что он «просто будет работать». В этом разделе мы рассмотрим некоторые определения типов данных, для подготовки к дополнительные проблемы, которые могут выполняться между при передаче табличных данных между Python и SQL Server.
- Кадр данных — это таблица с нескольких столбцов.
- Один столбец кадр данных, является объект как список с именем ряда.
- Одно значение — это ячейка кадра данных и должна быть вызвана по индексу.
Так как бы вы предоставляют один результат вычисления как кадра данных, если data.frame требует табличной структуры? Одно скалярное значение как ряд, который легко преобразовать в кадр данных должен быть представлен один ответ.
-
В этом примере не некоторых простых вычислений и преобразует скалярного в последовательности. Ряд требуется индекс, который можно назначить вручную, как показано ниже, или программно.
SQLexecute 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) ''
-
Поскольку ряды еще не были преобразованы в data.frame, возвращаются значения в окне сообщения, но можно увидеть, что результаты в формате более таблицы.
Результаты
textSTDOUT message(s) from external script: 0.5 simple math example 1 0.5 dtype: float64
-
К длине ряда, можно добавить новые значения с помощью массива.
SQLexecute 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 и заканчивая длину массива.
Результаты
textSTDOUT message(s) from external script: 0 0.5 1 2.0 dtype: float64
-
Если увеличить число индекса значения, но не добавлять новые данных значения, повторяющихся значений данных для заполнения ряда.
SQLexecute 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) ''
Результаты
textSTDOUT message(s) from external script: 0.5 simple math example 1 0.5 simple math example 2 0.5 dtype: float64
Преобразовать ряда кадра данных.
Математические скалярные результаты преобразуется в табличную структуру, по-прежнему нужно преобразовать их в формат, который может обрабатывать SQL Server.
-
Чтобы преобразовать последовательность data.frame, вызовите pandas кадр данныхметод.
SQLexecute 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 ))
-
Обратите внимание, что значения индекса не выводятся, даже если индекс используется для получения определенных значений из data.frame.
Результаты
ResultValue 0,5 2
Выходные значения в data.frame, использование индекса
Давайте посмотрим, как работает преобразование data.frame с наших двух рядов, содержащий результаты простой математических операций. Первый имеет индекс последовательные значения, созданные Python. Вторая использует произвольный индекса строковых значений.
-
В этом примере возвращает значение из серии, использующий целочисленного индекса.
SQLEXECUTE 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. Попробуйте использовать вне диапазона значения индекса и посмотрим, что произойдет.
-
Теперь давайте получают одно значение из других кадров данных с индексом строки.
SQLEXECUTE 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 г машины обучения (в базе данных).