使用 PySpark 时如何将 jdbc 驱动程序添加到类路径?

2023-11-24

如何/在哪里安装 Spark sql 的 jdbc 驱动程序?我正在运行全火花笔记本docker 镜像,并尝试将一些数据直接从 sql 数据库提取到 Spark 中。

据我所知,我可以告诉我需要将驱动程序包含在我的Classpath,我只是不知道如何做到这一点pyspark?

from pyspark.sql import SparkSession
spark = SparkSession \
    .builder \
    .master("local") \
    .appName("Python Spark SQL basic example") \
    .getOrCreate()

jdbcDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "jdbc:postgresql:dbserver") \
    .load()

---------------------------------------------------------------------------
Py4JJavaError                             Traceback (most recent call last)
<ipython-input-2-f3b08ff6d117> in <module>()
      2 spark = SparkSession     .builder     .master("local")     .appName("Python Spark SQL basic example")     .getOrCreate()
      3 
----> 4 jdbcDF = spark.read     .format("jdbc")     .option("url", "jdbc:postgresql:dbserver")     .option("dbtable", "jdbc:postgresql:dbserver")     .load()

/usr/local/spark/python/pyspark/sql/readwriter.py in load(self, path, format, schema, **options)
    163             return self._df(self._jreader.load(self._spark._sc._jvm.PythonUtils.toSeq(path)))
    164         else:
--> 165             return self._df(self._jreader.load())
    166 
    167     @since(1.4)

/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py in __call__(self, *args)
   1131         answer = self.gateway_client.send_command(command)
   1132         return_value = get_return_value(
-> 1133             answer, self.gateway_client, self.target_id, self.name)
   1134 
   1135         for temp_arg in temp_args:

/usr/local/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
     61     def deco(*a, **kw):
     62         try:
---> 63             return f(*a, **kw)
     64         except py4j.protocol.Py4JJavaError as e:
     65             s = e.java_exception.toString()

/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    317                 raise Py4JJavaError(
    318                     "An error occurred while calling {0}{1}{2}.\n".
--> 319                     format(target_id, ".", name), value)
    320             else:
    321                 raise Py4JError(

Py4JJavaError: An error occurred while calling o36.load.
: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:315)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:83)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:34)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:306)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
    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:280)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)

为了包含 postgresql 的驱动程序,您可以执行以下操作:

from pyspark.conf import SparkConf

conf = SparkConf()  # create the configuration
conf.set("spark.jars", "/path/to/postgresql-connector-java-someversion-bin.jar")  # set the spark.jars

...
spark = SparkSession.builder \
        .config(conf=conf) \  # feed it to the session here
        .master("local") \
        .appName("Python Spark SQL basic example") \
        .getOrCreate()

现在,由于您使用的是 Docker,我想您必须安装包含驱动程序 jar 的文件夹并引用安装的文件夹。 (例如。:如何在 Docker 容器中挂载主机目录)

希望这有帮助,祝你好运!

Edit: 另一种方法是给--driver-class-path使用时的参数spark-submit像这样:

spark-submit --driver-class-path=path/to/postgresql-connector-java-someversion-bin.jar file_to_run.py

但我猜这不是你运行它的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PySpark 时如何将 jdbc 驱动程序添加到类路径? 的相关文章

随机推荐

  • 本机 C# pdf 阅读器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要从 PDF 文件中提取文本 我找到了 iTextSharp 和 PDFBox 但它们都只是 Java 端口 为了使它们工作 我需要使用大量的附
  • CSS 背景图像在 iPhone 上的渲染方式不同

    我们的页面设计在我尝试过的所有 PC 浏览器中都表现良好 但在 iPhone 或 iPod Touch 上查看时却很奇怪 问题与非常高的居中背景图像有关 content container background image url cont
  • 在 log4net 中使用 smtpAppender 的多个 smtphost 地址

    我希望能够指定多个 smtp 服务器主机地址并实现一种逻辑 如果使用一个 smtp 服务器的电子邮件失败 它会尝试使用下一个 smtp 服务器地址发送 是否可以使用 log4net 我们可以重写 log4net 的一些功能并在其中实现我们自
  • android 设置首选项屏幕的分隔线填充

    我有 PreferenceScreen 包含许多 CheckBox 我通过将其引用到自定义布局来自定义它 如下所示
  • gnuplot 边距在多图模式下如何工作?

    我对 gnuplot 边距有点困惑 首先我不知道这些东西指向什么单位 它们是指向画布坐标还是画布坐标的一部分 它们在 gnuplot 模式和 multiplot 模式下的行为是否相同 在多图模式下绘制一些数据时出现了我的问题 我正在绘制到屏
  • 如何制作可重用的 HTML 导航菜单?

    我相信这个话题一直都会出现但我似乎无法给出一个简洁的答案 我有一个垂直菜单栏 我想在网页 gt 20 中重复使用它 这Menu Bar以 HTML 编码并使用 UL LI A div 标签和 CSS 我们需要这个 Reusable 可维护
  • Mysql 匹配...与“%term%”之类的简单匹配

    有什么问题 term POST search function buildQuery exploded count query if count exploded gt count query AND column LIKE explode
  • javax.tools 依赖于 JDK 吗?

    我想用JavaCompiler动态创建一些类 我找到了源代码javax tools封装了 但是没有实现 互联网上的一些帖子说这取决于tools jar 我不知道tools jar与 JRE 合作 那么 在没有安装JDK的情况下 可以在JRE
  • mycout 自动结束

    我想要实施类MyCout 它可以提供自动endl的可能性 即这段代码 MyCout mycout mycout lt lt 1 lt lt 2 lt lt 3 outputs 123 empty line here 是否可以实现具有此类功能
  • IOS:将图像添加到自定义 MKAnnotationview

    我想将自定义图像添加到地图中的注释中 我制作了以下自定义 MkAnnotationView import
  • 验证 do-while 循环中的输入类型

    基本上 我需要确保输入是integer 像这样 do printf Enter gt scanf d integer while user entered a char instead of an int 我尝试了各种方法 但当我尝试输入时
  • 是什么让这个头文件使 VS2005 慢得像爬行一样? (智能感知无罪?)

    我正在尝试使用 C 项目我在这里找到的编译时哈希技术 宏按预期工作 编译时间也合理 但 64 个递归宏似乎与 Visual Studio 的 Intellisense 玩得很不愉快 每次简短编辑后 IDE 都会挂起约 30 秒 我怀疑它正在
  • Android Chrome 浏览器中的通知 API

    我的网络应用程序使用通知API 我认为 KitKat 的 Chrome 浏览器应该有它 或者至少是旧的webkitNotifications 但两者window Notification and window webkitNotificat
  • 如何在 WinForms 中显示显示轨迹栏值的工具提示

    我是 C 和 WinForms 的新手 所以请原谅 这是一个新手问题 我正在尝试向 TrackBar 控件添加一个工具提示 该提示在您拖动该栏时显示该栏的当前值 我已经实例化了一个 ToolTip 对象并尝试了以下处理程序代码 但它没有显示
  • Spring 数据 JPA。子实体的分页

    我将 Spring Data JPA 与 Spring boot 版本 1 3 6 RELEASE 和内存数据库一起使用 我想知道如何对子实体进行分页来自父实体 将获取设置为LAZY对我来说不是一个解决方案 这是用例 Parent has
  • 格式化字符串未使用的命名参数[重复]

    这个问题在这里已经有答案了 假设我有 action bond james bond format bond bond james james 这将输出 bond james bond 接下来我们有 action bond james bon
  • UDP 数据包大小和数据包丢失

    我一直在编写一个程序 该程序在 UDP 之上使用停止和等待协议来通过 LAN 和 WAN 发送数据包 我最近测试了我的程序 发现数据包越大 接近 64k 字节 丢包率越高 直观上这是有道理的 但实际原因是什么 UDP 数据包大于MTU si
  • GraphQL Blackbox /“任何”类型?

    是否可以指定 GraphQL 中的字段应该是黑盒 类似于 Flow 具有 任意 类型 我的模式中有一个字段应该能够接受任何任意值 可以是字符串 布尔值 对象 数组等 我想出了一个中间立场的解决方案 我没有尝试将这种复杂性推到 GraphQL
  • 从图库中选择图像不适用于 Redmi Note 4

    我在 S O 上看到了几个与此相关的其他问题 但与我的问题最接近的一个似乎没有得到很多回复 小米设备无法从图库中选取图像 希望这个问题能有更好的运气 我正在尝试从手机图库中选择图像 并将图像路径传递到另一个活动 以便用户预览该图像 我已经在
  • 使用 PySpark 时如何将 jdbc 驱动程序添加到类路径?

    如何 在哪里安装 Spark sql 的 jdbc 驱动程序 我正在运行全火花笔记本docker 镜像 并尝试将一些数据直接从 sql 数据库提取到 Spark 中 据我所知 我可以告诉我需要将驱动程序包含在我的Classpath 我只是不