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