MSSQL Server 2017 Python 分析服务的多个输入源

Multiple input sources for MSSQL Server 2017 Python analytical services

我目前正在使用 Python 将一些代码从 Spark 移植到 MSSQL 分析服务。一切都很好,但我不确定我的解决方案是否适用于脚本的多个输入。

考虑以下代码片段:

DROP PROCEDURE IF EXISTS SampleModel;
GO

CREATE PROCEDURE SampleModel
AS
BEGIN
exec sp_execute_external_script  
@language =N'Python',
@script=N'
import sys
sys.path.append("C:\path\to\custom\package")

from super_package.sample_model import run_model

OutputDataSet = run_model()'
WITH RESULT SETS ((Score float));
END
GO

INSERT INTO [dbo].[SampleModelPredictions] (prediction) EXEC [dbo].[SampleModel]
GO

我有一个名为 super_package 的自定义包和一个名为 sample_model 的示例模型。由于此模型使用多个数据库表作为输入,我宁愿将所有内容都放在一个地方我有一个连接到数据库并直接获取数据的模块:

def go_go_get_data(query, config):
    return rx_data_step(RxSqlServerData(
        sql_query=query,
        connection_string=config.connection_string,
        user=config.user,
        password=config.password))

run_model() 函数中,我使用 go_go_get_data 函数从数据库中获取所有必要的数据。

如果数据太大无法一次处理,我会进行一些分页。 一般来说,我不能加入表格,所以这个解决方案不起作用。 问题是:这是解决这个问题的正确方法吗?还是我错过了什么?现在这可行,但由于我仍处于开发/试用阶段,我不能确定这是否会扩展。我宁愿使用存储过程的参数也不愿在 Python 上下文中获取。

如您所知,sp_execucte_external_script 只允许传入一个结果集。:-(

只要您的脚本没有在当前 SQL 会话的用户权限下执行,您当然可以从脚本内部查询以获取数据。

如果分页很重要并且一个数据集明显大于其他数据集并且您使用的是企业版,您可以考虑将最大的数据集分块传递到脚本中使用 sp_execute_external_script 的流媒体功能。

如果您希望在 SQL 服务器中收集所有数据(相对于通过脚本中的查询获取),您可以尝试 (link描述了如何在 R 中执行此操作,但使用 Python).

应该可以实现类似的操作