无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL

Posted

技术标签:

【中文标题】无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL【英文标题】:Unable to connect to MS SQL from Apache Spark using pyspark on Jupyter notebook 【发布时间】:2019-10-18 10:37:21 【问题描述】:

我正在尝试使用 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 脚本所在的位置相同。

我得到的错误:

和:

【问题讨论】:

请更改被涂黑的字符串的字符,然后粘贴option。如果里面有特殊字符等 我的密码中有“_”。这可以接受吗? 是的。错误中有关于-的内容 【参考方案1】:

编辑

请查看此链接:Characters that are not allowed in table name & column name in sql server ?

第一个字符必须是以下之一:

Unicode 标准 3.2 定义的字母。字母的 Unicode 定义包括从 a 到 z、从 A 到 Z 的拉丁字符,以及来自其他语言的字母字符。

下划线 (_)、at 符号 (@) 或数字符号 (#)。

后续字符可以包括以下内容:

Unicode 标准 3.2 中定义的字母。

来自基本拉丁文或其他国家文字的十进制数字。

at 符号、美元符号 ($)、数字符号或下划线。

请尝试使用我为连接 SQL 数据库而创建的这个函数(它将驱动程序作为连接属性的一部分,并在运行时下载驱动程序):

def connect_to_sql(
    spark, jdbc_hostname, jdbc_port, database, data_table, username, password
):
    jdbc_url = "jdbc:sqlserver://0:1/2".format(jdbc_hostname, jdbc_port, database)

    connection_details = 
        "user": username,
        "password": password,
        "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
    

    df = spark.read.jdbc(url=jdbc_url, table=data_table, properties=connection_details)
    return df

只需传递必要的参数,它就会开始工作。如果没有,请告诉我,我会进行必要的更改。

【讨论】:

我现在试试你的功能。 “_”不在列名中,它只是在密码中。 好的,我改一下密码再试一次。 @Harvey 是关于表名和列名的【参考方案2】:

我使用 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 是否已按照建议 here 启用,并确保您的防火墙没有阻止访问 MS SQL 服务器正在侦听的 1433 端口。 最终密码中不支持的字符无关紧要。

【讨论】:

以上是关于无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter 上的 TensorFlow:无法恢复变量

在 Azure ML 上的 jupyter notebook 中加载 csv 并设置参数

更改级别记录到 IPython/Jupyter 笔记本

Docker 上的 Jupyter 笔记本 - 权限被拒绝

Jupyter Notebook中Google Colaboratory上的IOPub错误

无法使用 Jupyter 笔记本在 Python 中导入自定义模块