首页 > 解决方案 > 无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL

问题描述

我正在尝试使用 Jupyter Notebook 中的 pyspark 从 MS SQL 服务器加载数据。Spark 已经过测试并且工作正常。我正在使用以下内容:

from pyspark import SparkContext, SparkConf, SQLContext

appName = "PySpark SQL Server Example - via JDBC"
master = "local"
conf = SparkConf() \
    .setAppName(appName) \
    .setMaster(master) \
    .set("spark.driver.extraClassPath","mssql-jdbc-7.4.1.jre8.jar")
sc = SparkContext.getOrCreate(conf=conf)
sqlContext = SQLContext(sc)
spark = sqlContext.sparkSession

# Loading data from a JDBC source
jdbcDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("url", "jdbc:sqlserver://188.188.188.188:10004;databaseName=dbnme") \
    .option("dbtable", "dbo.tablename") \
    .option("user", "usernmame") \
    .option("password", "pawwrod") \
    .load()

我的 MS SQL 驱动程序 ( mssql-jdbc-7.4.1.jre8.jar) jar 与我的 python 脚本所在的位置相同。

我得到的错误:

在此处输入图像描述

和:

在此处输入图像描述

标签: pythonpython-3.xapache-sparkpysparkjupyter-notebook

解决方案


我使用 Apache Spark 2.4.4 和 Hadoop 2.7 及更高版本。这是最后对我有用的代码:

from pyspark import SparkContext, SparkConf, SQLContext

appName = "PySpark SQL Server Example - via JDBC"
master = "local"
conf = SparkConf() \
    .setAppName(appName) \
    .setMaster(master) \
    .set("spark.driver.extraClassPath","mssql-jdbc-7.4.1.jre8.jar")
sc = SparkContext.getOrCreate(conf=conf)
sqlContext = SQLContext(sc)
spark = sqlContext.sparkSession

hostname = "localhost"
database = "HumanResources"
port = "1433"
table = "dbo.Employee"
user = "sa"
password  = "Dedo9090"

jdbcDF = spark.read.format("jdbc") \
    .option("url", f"jdbc:sqlserver://ILI-LAB-HRVOJE;databaseName={database}") \
    .option("dbtable", table) \
    .option("user", user) \
    .option("password", password) \
    .load()

jdbcDF.head(50)

如果您在访问 SQL 服务器时仍然遇到问题,请参阅此处建议的启用 TCP/IP,并确保您的防火墙没有阻止访问 MS SQL 服务器正在侦听的 1433 端口。最后,密码中不支持的字符无关紧要。


推荐阅读