Ответ 1
Если вы хотите включить функцию Python в сам SQL, вот пример Эда Фримена, который представляет собой сценарий, который отображает день с 1
7
на день недели с Mon
Sun
.
Входные данные вставляются с помощью следующей команды:
DROP TABLE IF EXISTS DaysOfWeek
CREATE TABLE DaysOfWeek (
[DayOfWeek] nvarchar(10) NOT NULL
)
GO
INSERT INTO DaysOfWeek VALUES
('Sunday'),
('Monday'),
('Tuesday'),
('Wednesday'),
('Thursday'),
('Friday'),
('Saturday'),
('Friday'),
('Monday'),
('Sunday')
GO
Запрос на отображение дня выглядит следующим образом:
EXEC sp_execute_external_script
@language = N'Python',
@script = N'
OutputDataSet = InputDataSet
global daysMap
daysMap = {
"Monday" : 1,
"Tuesday" : 2,
"Wednesday" : 3,
"Thursday" : 4,
"Friday" : 5,
"Saturday" : 6,
"Sunday" : 7
}
OutputDataSet["DayOfWeekNumber"] = pandas.Series([daysMap[I] for i in OutputDataSet["DayOfWeek"]], index = OutputDataSet.index, dtype = "int32")
',
@input_data_1 = N'SELECT * FROM DaysOfWeek',
@input_data_1_name = N'InputDataSet'
WITH RESULT SETS (("DayOfWeek" nvarchar(10) null,"DayOfWeekNumber" int null))
Но больший скрипт будет выглядеть грязно внутри хранимой процедуры. Поэтому нам нужно упаковать файл Python и затем импортировать его в сценарий. Итак, создайте папку и вставьте пустой файл
__init__.py
вместе с вашими файлами Python, которые содержат определения. Эта папка должна быть расположена где-то, что SQL может увидеть. Затем с помощью командыsys.path.append
добавьте пользовательский каталог в системные пути, чтобы интерпретатор мог найти файл. После помещения упакованных файлов в папкуPYTHON_SERVICES
внутри каталога экземпляраSQL
все, что вам нужно сделать, это импортировать модуль и вызвать его определение.
Определение выглядит так:
def map_days(InputDataSet):
import pandas
OutputDataSet = InputDataSet
global daysMap
daysMap = {
"Monday" : 1,
"Tuesday" : 2,
"Wednesday" : 3,
"Thursday" : 4,
"Friday" : 5,
"Saturday" : 6,
"Sunday" : 7
}
OutputDataSet["DayOfWeekNumber"] = pandas.Series([daysMap[i] for i in OutputDataSet["DayOfWeek"]], index = OutputDataSet.index, dtype = "int32")
return OutputDataSet
Затем вызовите его прямо в SQL:
EXEC sp_execute_external_script
@language = N'Python',
@script = N'
from MyPackages.pysql_examples.day_mapper import map_days
OutputDataSet = map_days(InputDataSet)
',
@input_data_1 = N'SELECT * FROM DaysOfWeek',
@input_data_1_name = N'InputDataSet'
WITH RESULT SETS (("DayOfWeek" nvarchar(10) null,"DayOfWeekNumber" int null))
И вот (в качестве второго примера) простое приложение от Аликс Гамильтон на GitHub, которое выполняет запрос с BigQuery, просто используя функцию Python:
from google.cloud import bigquery
def query_stackoverflow():
client = bigquery.Client()
query_job = client.query("""SELECT CONCAT(
'https://stackoverflow.com/questions/',
CAST(id as STRING)) as url,
view_count FROM 'bigquery-public-data.stackoverflow.posts_questions'
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
LIMIT 10""")
results = query_job.result()
for row in results:
print("{} : {} views".format(row.url, row.view_count))
if __name__ == '__main__':
query_stackoverflow()
Надеюсь это поможет.