【问题标题】:Error while Inserting spark dataframe into SQL Server将 spark 数据帧插入 SQL Server 时出错
【发布时间】:2022-12-12 10:56:47
【问题描述】:

我正在使用 pyspark 将 spark 数据帧插入到 SQL Server 数据库中的表中......

我使用 pycharm 作为 IDE,

这是我的代码 sn-p,

server_name = "SERVER"
database_name = "DB"
url = "jdbc:sqlserver://{"+server_name+"} "+ ";" + "databaseName=" + database_name + ";"

table_name = "Table_Temp"
username = "USER"
password = "PASS" 


df_target.write \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .mode("overwrite") \
    .option("url", url) \
    .option("dbtable", table_name) \
    .option("user", username) \
    .option("password", password) \
    .save()

在执行上述 sn-p 时,出现以下错误

Traceback (most recent call last):
  File "E:\python\SCD2.py", line 129, in <module>
    df_target.write \
  File "E:\spark-3.3.1-bin-hadoop3\python\lib\pyspark.zip\pyspark\sql\readwriter.py", line 966, in save
  File "E:\spark-3.3.1-bin-hadoop3\python\lib\py4j-0.10.9.5-src.zip\py4j\java_gateway.py", line 1321, in __call__
  File "E:\spark-3.3.1-bin-hadoop3\python\lib\pyspark.zip\pyspark\sql\utils.py", line 190, in deco
  File "E:\spark-3.3.1-bin-hadoop3\python\lib\py4j-0.10.9.5-src.zip\py4j\protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o198.save.
: java.lang.ClassNotFoundException: 
Failed to find data source: com.microsoft.sqlserver.jdbc.spark. Please find packages at
https://spark.apache.org/third-party-projects.html
       
    at org.apache.spark.sql.errors.QueryExecutionErrors$.failedToFindDataSourceError(QueryExecutionErrors.scala:587)
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:675)
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSourceV2(DataSource.scala:725)
    at org.apache.spark.sql.DataFrameWriter.lookupV2Provider(DataFrameWriter.scala:864)
    at org.apache.spark.sql.DataFrameWriter.saveInternal(DataFrameWriter.scala:256)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
    at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.spark.DefaultSource
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.apache.spark.sql.execution.datasources.DataSource$.$anonfun$lookupDataSource$5(DataSource.scala:661)
    at scala.util.Try$.apply(Try.scala:213)
    at org.apache.spark.sql.execution.datasources.DataSource$.$anonfun$lookupDataSource$4(DataSource.scala:661)
    at scala.util.Failure.orElse(Try.scala:224)
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:661)

我已经安装了星火。 我真的不知道我要去哪里错了......

请帮我...

【问题讨论】:

    标签: python sql-server dataframe pyspark


    【解决方案1】:

    在尝试将数据框保存到 SQL Server 数据库时,您似乎遇到了 java.lang.ClassNotFoundException 错误。当您用于连接到 SQL Server 的 JDBC 驱动程序不在您的 Spark 应用程序的类路径中时,会发生此错误。

    要修复此错误,您需要将 SQL Server 的 JDBC 驱动程序添加到您的类路径中。在 PyCharm 中,您可以通过转到“项目结构”窗口,单击“库”选项卡,然后将 JDBC 驱动程序 jar 文件添加到您的类路径来完成此操作。完成后,尝试再次运行您的代码,看看它是否有效。

    如果仍有问题,您可能需要检查 url 变量中的连接设置以确保它们正确无误。 JDBC 连接字符串的格式应如下所示:

    复制代码

    jdbc:sqlserver://<server>:<port>;databaseName=<database>;user=<username>;password=<password>
    

    您也可以尝试使用不同的 JDBC 驱动程序,例如微软提供的驱动程序,您可以从这里下载:https://www.microsoft.com/en-us/download/details.aspx?id=11774

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 2019-12-21
      • 1970-01-01
      • 2017-04-15
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多