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

2024-10-02 08:18:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Jupyter笔记本中的pyspark从mssqlserver加载数据。 火花经过测试,工作正常。 我正在使用以下命令:

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()

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

我得到的错误:

enter image description here

以及:

enter image description here


Tags: frommasterconfsparkpysparkjaroptionmssql
2条回答

我使用ApacheSpark2.4.4和Hadoop2.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 server仍有问题,请查看TCP/IP是否已按建议启用here,并确保防火墙未阻止对MS SQL server正在侦听的1433端口的访问。 最后不是密码中不支持字符的问题。你知道吗

编辑:

请检查此链接: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

只要通过必要的论证,它就会起作用。如果不行,请告诉我,我会做必要的改变。你知道吗

相关问题 更多 >

    热门问题