Spark执行Action操作访问Wonderware Historian DB时抛出OLE DB连接错误
已通过Spark成功加载Wonderware Historian SQL数据库的DataFrame,执行df.columns查看列名,返回结果如下:
'TagName',
'Value',
'vValue',
'Quality',
'QualityDetail',
'OPCQuality',
'wwTagKey',
'wwRowCount',
'wwResolution',
...
但执行任何Action操作(如df.select('TagName').head())都会触发错误,错误信息如下:
org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 13.0 failed 4 times, most recent failure: Lost task
0.3 in stage 13.0 (TID 55) (10.252.13.132 executor driver): com.microsoft.sqlserver.jdbc.SQLServerException: An error occurred
during the current command (Done status 0). Cannot execute the query
"SELECT Tbl1001.TagName Col1005 FROM Runtime.dbo.History Tbl1001"
against OLE DB provider "INSQL" for linked server "INSQL".
可行解决方向
- 检查链接服务器权限:确认Spark使用的SQL Server账号对INSQL链接服务器拥有足够权限,能直接执行跨服务器查询。部分场景下,链接服务器的权限配置会限制此类查询执行。
- 禁用Spark查询下推:Spark默认会把查询逻辑下推到数据源执行,但Wonderware的INSQL OLE DB驱动可能不兼容Spark生成的嵌套查询格式。可通过关闭下推优化解决:
// Scala示例:读取数据时禁用查询下推 val props = new java.util.Properties() props.setProperty("user", "你的账号") props.setProperty("password", "你的密码") val df = spark.read .option("pushDownPredicate", "false") .option("pushDownAggregate", "false") .jdbc("SQLServer链接地址", "Runtime.dbo.History", props) - 改用Wonderware原生接口读取:Wonderware Historian提供REST API等专用数据读取接口,相比通过SQL链接服务器,直接使用原生接口可避免OLE DB驱动的兼容性问题,数据读取更稳定。
- 更新驱动版本:确保SQL Server JDBC驱动与INSQL OLE DB驱动版本匹配,升级到最新稳定版可能解决兼容性bug。
内容的提问来源于stack exchange,提问作者Oliver Angelil

