Spark/Pyspark 通过JDBC连接Sqlserver

记录一下连接sqlserver的过程,遇到的坑太多了,防止忘记

版本

在这里插入图片描述
在这里插入图片描述
sqlserver版本:在这里插入图片描述

Spark的版本不确定是否对连接过程有影响,反正现在都是用的3.0版本网上的,我就以我目前的版本来说吧。

出现过得坑爹问题

SqlServer的版本很老,这里就有个坑,因为jdk的版本是1.8的341,这个版本的TSL协议1.2,1.3的,而这个版本的SqlServer的TSL协议是1.0,硬要连接会报以下错误:
在这里插入图片描述
The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

查看jdk的版本说明:
在这里插入图片描述
根据这个说明,这个版本用的是不支持1.0的,所以得查看以往的版本,直到这个版本的说明:https://www.oracle.com/java/technologies/javase/8u291-relnotes.html
在这里插入图片描述
291的版本说1.0和1.1已经被禁用了,那么要用得重装旧版本,但是重新装很麻烦,所以下面这句很重要,可以通过修改这个配置文件来启用TSL1.0,
通过从 java.security 配置文件中的 jdk.tls.disabledStrategies 安全属性中删除“ TLSv1”和/或“ TLSv1.1”来重新启用版本。
找到jdk安装路径下的这个文件:
在这里插入图片描述
在这里插入图片描述
这里只有jdk.tls.disabledAlgorithms没有jdk.tls.disabledStrategies,我感觉没关系,因为整个文件只有这一块有 TLSv1, TLSv1.1,把他们删掉保存即可

下载JDBC的驱动jar包
https://learn.microsoft.com/zh-cn/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16#previous-releases
在这里插入图片描述
这边下载的是9.4的版本,没有新版本是因为后续会报错,一直下载试到这个版本才没有报错,将对应的jar包移动到对应python 环境下(我这的虚拟环境路径如下/export/server/miniconda/envs/pyspark/lib/python3.8/site-packages/pyspark/jars
在这里插入图片描述
在这里插入图片描述

代码实现

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# SparkSession对象导包,对象是来自于pyspark.sql包中
import time

from pyspark.sql import SparkSession
import os

# 远程调试需要添加环境变量进去
os.environ["JAVA_HOME"] = "/export/server/jdk1.8.0_341"
os.environ['PYSPARK_PYTHON'] = '/export/server/miniconda/envs/pyspark/bin/python'
if __name__ == '__main__':
    # 构建SparkSession执行环境入口对象
    spark = SparkSession.builder.appName("sqlserver").master("local[*]").getOrCreate()
        # config("spark.driver.extraClassPath", "/export/project/02_SQL/database/sqljdbc_10.2/chs/mssql-jdbc-10.2.1.jre8.jar").\

    sc = spark.sparkContext
    host = "数据库的地址"
    user = "用户名"
    pwd = "密码"
    port = "3433"
    database = "数据库名称"
    url = "jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + database
    # 数据库读出
    data = spark.read.format("jdbc"). \
        option("url", url). \
        option('dbtable', "查看的表格"). \
        option("user", user). \
        option("password", pwd). \
        option("encoding", "ascii"). \
        load()

    data.show()

在这里插入图片描述
如果用高版本的JDCB,则会报以下错误
在这里插入图片描述
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值