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

时间:2017-10-30 16:13:02

标签: python sql-server sql-server-2017

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

请考虑以下代码段:

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上下文中获取。

1 个答案:

答案 0 :(得分:2)

正如您已经发现的那样,sp_execucte_external_script只允许传入一个结果集。: - (

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

如果分页很重要且一个数据集明显大于其他并且您正在使用Enterprise Edition ,则可以考虑使用{{}将最大的数据集传递到块中。 1}}的流媒体功能。

如果您希望在SQL Server中汇总所有数据(而不是脚本中的查询提取),您可以尝试serialize the result sets and then pass them in as parameters(链接描述如何在R中执行此操作但是类似的东西应该可以用Python)。