apache-spark - 从 PySpark 加载数据帧
问题描述
我正在尝试使用spark.read.jdbc从PySpark连接到MS SQL DB
import os
from pyspark.sql import *
from pyspark.sql.functions import *
from pyspark import SparkContext;
from pyspark.sql.session import SparkSession
sc = SparkContext.getOrCreate()
spark = SparkSession(sc)
df = spark.read \
.format('jdbc') \
.option('url', 'jdbc:sqlserver://local:1433') \
.option('user', 'sa') \
.option('password', '12345') \
.option('dbtable', '(select COL1, COL2 from tbl1 WHERE COL1 = 2)')
然后我执行 df.load() 并返回错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\spark\spark\python\pyspark\sql\readwriter.py", line 172, in load
return self._df(self._jreader.load())
File "C:\spark\spark\python\lib\py4j-0.10.7-src.zip\py4j\java_gateway.py", line 1256, in __call__
File "C:\spark\spark\python\pyspark\sql\utils.py", line 63, in deco
return f(*a, **kw)
File "C:\spark\spark\python\lib\py4j-0.10.7-src.zip\py4j\protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o42.load.
: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(Unknown Source)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$6.apply(JDBCOptions.scala:105)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$6.apply(JDBCOptions.scala:105)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:104)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:35)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)
怎么了?
解决方案
您需要下载 JDBC 驱动程序并将其放入您的 spark/jars 文件夹中。
对于 SQL SERVER JDBC 驱动程序,您可以从https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server下载-ver15
推荐阅读
- javascript - 导出默认函数在 ReactJS 中返回未定义的值
- file-upload - jersey restful 文件上传服务器使用八位字节流,没有 multipart/form-data
- python - 使用 Flask-SQLAlchemy 创建的表,但它们没有显示在 sqlite 命令行(shell)上
- google-sheets - 从具有所有相同跨度名称的网站上抓取
- c - 如何用另一个数字的位按位替换一个数字中的一系列位以增加,而不影响低位?
- node.js - peer.on('callll') 永远不会被调用
- git - 为什么我的 package.json 文件在告诉我它已更新后没有显示在 Github 上?
- java - node == null 如何检查堆栈是否已满?
- python - 如何保存我的应用程序的状态?kivy/kivyMD
- python - 定义异常时不必要的传递