我正在尝试在MS SQL SERVER 2017中构建Python模型。我曾尝试使用一些教程,但结果与预期相差甚远。我想知道此脚本出了什么问题(将SQL表加载到pandas数据帧中):
USE PREPRESS_TMP;
GO
EXEC sp_execute_external_script
@language=N'Python',
@script=N'
dataset = pandas.DataFrame(input_data)
',
@input_data_1 = N'Select * FROM dbo.Rests_GO'
GO
错误消息是:
STDOUT message(s) from external script:
Express Edition will continue to be enforced.
SqlSatelliteCall function failed. Please see the console output for more information.
Traceback (most recent call last):
File "C:\Program Files\Microsoft SQL
Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py", line 406, in
rx_sql_satellite_call
rx_native_call("SqlSatelliteCall", params)
File "C:\Program Files\Microsoft SQL
Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py", line 291, in rx_native_call
ret = px_call(functionname, params)
RuntimeError: revoscalepy function failed.
很高兴接受任何帮助。
答案 0 :(得分:1)
您使用的是Express Edition,对吗?参见:https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2017?view=sql-server-2017。 您的代码没有错,尽管您应该包括输入数据以使内容清晰明了,如下所示
使用AdventureWorksDW2014 去
EXEC sp_execute_external_script
@language = N'Python',
@ script = N'
将熊猫作为pd导入
从熊猫导入DataFrame
OutputDataSet = pd.DataFrame(InputDataSet.describe())
',
@ input_data_1 = N'SELECT
CAST(TotalProductCost AS浮动)
,CAST(浮动单价)
,CAST(OrderQuantity AS FLOAT)
来自FactInternetSales'
与结果集((
TotalProduct成本浮动
,单价浮动
,OrderQuantity FLOAT
))
答案 1 :(得分:1)
尽管我无法回答您的错误,但是您确实需要另一个参数“ input_data_x_name”才能使代码正常工作:
EXEC sp_execute_external_script
@language=N'Python',
@script=N'dataset = pandas.DataFrame(input_data)',
@input_data_1 = N'Select * FROM dbo.Rests_GO',
@input_data_1_name = N'input_data'
答案 2 :(得分:0)
尽管Express Edition 是 SQL Server版本之一,但此消息略有不同,它告诉您Python客户端库是在SQL Server Express Edition的限制下获得许可的。您可以放心地忽略它,除非您担心线下的可扩展性。实际上,您会在SQL Server Standard Edition上看到有关限制(内存数据集和最大2核处理)的相同错误消息-我已经看过很多遍了,并且只是对其准确性进行了仔细检查。 总之,第一条消息是参考消息,而不是错误消息,因此您可以放心地忽略输出的那部分。
消息的第二部分是您要关注的内容(调试此类TSQL / Python代码时几乎总是这样)。
因此,上面给出的user3912517的解决方案是正确的,尽管它对于理解为什么可能有用。
简单说明: Python需要使用名称引用从SQL Server传入的数据集。
它通过@ input_data_1_name参数执行此操作,该参数有效地“命名”由@ input_data_1中定义的查询返回的数据。
这提供了在SQL Server环境中运行的查询返回的数据集与Python代码引用Python环境中的同一数据集所需的数据框之间的链接。