Postgresql Apache Spark:JDBC连接不工作

Postgresql Apache Spark:JDBC连接不工作,postgresql,jdbc,apache-spark,apache-spark-sql,Postgresql,Jdbc,Apache Spark,Apache Spark Sql,我以前也问过这个问题,但没有得到任何答案() 我已经在本地windows上成功安装了Spark 1.3.0,并使用pyspark shell运行示例程序进行测试 现在,我想对存储在Postgresql中的数据从Mllib运行关联,但我无法连接到Postgresql 我已经通过运行 pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar" 我可以看到jar成功地添加到了环境UI中 当我在pysparkshell中运行以下命令时-

我以前也问过这个问题,但没有得到任何答案()

我已经在本地windows上成功安装了Spark 1.3.0,并使用pyspark shell运行示例程序进行测试

现在,我想对存储在Postgresql中的数据从Mllib运行关联,但我无法连接到Postgresql

我已经通过运行

pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar"
我可以看到jar成功地添加到了环境UI中

当我在pysparkshell中运行以下命令时-

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]")  
我得到这个错误-

>>> df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\pyspark\sql\context.py", line 482, in load
    df = self._ssql_ctx.load(source, joptions)
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\java_gateway.py", line 538, in __call__
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o20.load.
: java.sql.SQLException: No suitable driver found for     jdbc:postgresql://[host]/[dbname]
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:207)
        at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:94)
        at org.apache.spark.sql.jdbc.JDBCRelation.<init>    (JDBCRelation.scala:125)
        at  org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114)
        at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290)
        at org.apache.spark.sql.SQLContext.load(SQLContext.scala:679)
        at org.apache.spark.sql.SQLContext.load(SQLContext.scala:667)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
        at py4j.Gateway.invoke(Gateway.java:259)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
        at py4j.commands.CallCommand.execute(CallCommand.java:79)
        at py4j.GatewayConnection.run(GatewayConnection.java:207)
        at java.lang.Thread.run(Thread.java:619)
df=sqlContext.load(source=“jdbc”,url=“jdbc:postgresql://[host]/[dbname]”,dbtable=“[schema.table]”) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 加载文件“C:\Users\ACERNEW3\Desktop\Spark\Spark-1.3.0-bin-hadoop2.4\python\pyspark\sql\context.py”,第482行 df=自加载(源、作业) 文件“C:\Users\ACERNEW3\Desktop\Spark\Spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\java\u gateway.py”,第538行,在u调用中__ 文件“C:\Users\ACERNEW3\Desktop\Spark\Spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\protocol.py”,第300行,在get\u return\u值中 py4j.protocol.Py4JJavaError:调用o20.load时出错。 :java.sql.SQLException:未找到适合jdbc的驱动程序:postgresql://[host]/[dbname] 位于java.sql.DriverManager.getConnection(DriverManager.java:602) 位于java.sql.DriverManager.getConnection(DriverManager.java:207) 位于org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:94) 位于org.apache.spark.sql.jdbc.jdbc关系。(jdbcorrelation.scala:125) 位于org.apache.spark.sql.jdbc.DefaultSource.createRelation(jdbcreation.scala:114) 位于org.apache.spark.sql.sources.resolvedatasource$.apply(ddl.scala:290) 位于org.apache.spark.sql.SQLContext.load(SQLContext.scala:679) 位于org.apache.spark.sql.SQLContext.load(SQLContext.scala:667) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379) 在py4j.Gateway.invoke处(Gateway.java:259) 位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 在py4j.commands.CallCommand.execute(CallCommand.java:79) 在py4j.GatewayConnection.run处(GatewayConnection.java:207) 运行(Thread.java:619)
当您使用错误版本的JDBC驱动程序时,似乎会抛出此错误。检查以确保你有正确的一个

特别注意:

JDK1.1-JDBC1。请注意,在8.0版本中,JDBC1支持 已删除,所以请在更新服务器时更新JDK

JDK1.2,1.3-JDBC2。JDK1.3+J2EE-JDBC2EE。这包括 对javax.sql类的额外支持

JDK1.4、1.5-JDBC3。这包含对SSL和javax.sql的支持,但不需要J2EE,因为它已添加到J2SE版本中。JDK1.6-JDBC4。对JDBC4方法的支持还不完全,但大多数方法都已实现

JDK1.7、1.8-JDBC41。不支持JDBC4方法 完成,但大多数方法都已实现


我在mysql/mariadb上遇到了这个问题,从

因此,您的pyspark命令应该是:

pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>
pyspark--conf spark.executor.extraClassPath=--驱动程序类路径--jars--master

另外,请注意pyspark启动时出现的错误,如“警告:本地jar…不存在,正在跳过”和“ERROR SparkContext:jar not found at…”,这可能意味着您拼写的路径错误。

一个稍微优雅一点的解决方案:

val props = new Properties
props.put("driver", "org.postgresql.Driver")
sqlContext.read.jdbc("jdbc:postgresql://[host]/[dbname]", props)

请看这篇文章,把你的脚本放在所有选项之后

正如杰克建议的那样

“驱动程序”,“org.postgresql.driver”

缺少键值对。就我而言,我启动了pyspark作为:

pyspark --jars /path/to/postgresql-9.4.1210.jar
按照以下说明:

  from pyspark.sql import DataFrameReader

  url = 'postgresql://192.168.2.4:5432/postgres'
  properties = {'user': 'myUser', 'password': 'myPasswd', 'driver': 'org.postgresql.Driver'}
  df = DataFrameReader(sqlContext).jdbc(
      url='jdbc:%s' % url, table='weather', properties=properties
  )
  df.show()

  +-------------+-------+-------+-----------+----------+
  |         city|temp_lo|temp_hi|       prcp|      date|
  +-------------+-------+-------+-----------+----------+
  |San Francisco|     46|     50|       0.25|1994-11-27|
  |San Francisco|     43|     57|        0.0|1994-11-29|
  |      Hayward|     54|     37|0.239999995|1994-11-29|
  +-------------+-------+-------+-----------+----------+
测试日期:

  • Ubuntu 16.04

  • PostgreSQL server 9.5版

  • 使用的Postgresql驱动程序是Postgresql-9.4.1210.jar

  • Spark版本是Spark-2.0.0-bin-hadoop2.6

  • 但我也相信,它也应该起作用 spark-2.0.0-bin-hadoop2.7

  • Java JDK 1.8 64位

其他JDBC驱动程序可以在以下位置找到:

我遵循的教程是关于:

在以下方面也提出了类似的解决方案:
这很简单。要连接到外部数据库以将数据检索到Spark dataframes中,需要额外的jar文件。例如,MySQL需要JDBC驱动程序。下载驱动程序包并在集群中每个节点都可以访问的路径中提取mysql-connector-java-x.yy.zz-bin.jar。最好是共享文件系统上的路径。例如,对于Pouta虚拟集群,该路径将位于/shared_data下,这里我使用/shared_data/thirdparty_jars/

通过从终端直接提交Spark作业,one可以指定–driver class path参数,该参数指向应提供给作业工人的额外JAR。但是,这种方法不起作用,因此我们必须在spark-defaults.conf文件(通常位于/opt/spark/conf目录)中为前端节点和工作节点配置这些路径

spark.driver.extraClassPath/“您的路径”/mysql-connector-java-5.1.35-bin.jar
spark.executor.extraClassPath/“您的路径”/mysql-connector-java-5.1.35-bin.jar

绝对重复的可能重复!它是由同一个用户发布的!是的,它是重复的。。这是一个更详细的版本。请帮帮我,你不应该