0

我目前正在使用 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 上下文中获取。

4

1 回答 1

2

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

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

如果分页很重要,并且一个数据集明显大于其他数据集并且您使用的是 Enterprise Editionsp_execute_external_script ,您可以考虑使用的流式传输功能将最大的数据集以块的形式传递到脚本中。

如果您希望在 SQL Server 中组装所有数据(而不是通过脚本中的查询获取),您可以尝试序列化结果集,然后将它们作为参数传递(链接描述了如何在 R 中执行此操作但类似的东西应该可以用 Python 实现)。

于 2017-10-31T20:18:26.430 回答