Apache Spark:JDBC连接无法正常工作

Son*_*ank 10 postgresql jdbc apache-spark apache-spark-sql

我之前也问过这个问题,但没有得到任何答案(无法在pyspark shell中使用jdbc连接到postgres).

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

现在,我想对存储在Postgresql中的数据运行Mllib的Correlations,但是我无法连接到postgresql.

我已成功通过运行在类路径中添加了所需的jar(测试此jar)

pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar"
Run Code Online (Sandbox Code Playgroud)

我可以看到jar已成功添加到环境UI中.

当我在pyspark shell中运行以下代码时 -

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]")  
Run Code Online (Sandbox Code Playgroud)

我得到这个错误 -

>>> 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)
Run Code Online (Sandbox Code Playgroud)

8fo*_*rty 12

我对mysql/mariadb有这个确切的问题,并从这个问题得到了大的线索

所以你的pyspark命令应该是:

pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>
Run Code Online (Sandbox Code Playgroud)

还要注意pyspark启动时的错误,如"警告:本地jar ...不存在,跳过".和"错误的SparkContext:罐子里找不到......",这些可能意味着你拼错了路径.


小智 0

当您使用错误版本的 JDBC 驱动程序时,似乎会引发此错误。检查https://jdbc.postgresql.org/download.html以确保您拥有正确的版本。

特别注意:

JDK 1.1 - JDBC 1。请注意,在 8.0 版本中,JDBC 1 支持已被删除,因此在更新服务器时请更新 JDK。

JDK 1.2、1.3 - JDBC 2。JDK 1.3 + J2EE - JDBC 2 EE。这包含对 javax.sql 类的附加支持。

JDK 1.4、1.5 - JDBC 3。这包含对 SSL 和 javax.sql 的支持,但不需要 J2EE,因为它已添加到 J2SE 版本中。JDK 1.6 - JDBC4。对 JDBC4 方法的支持并不完整,但大多数方法都已实现。

JDK 1.7、1.8 - JDBC41。对 JDBC4 方法的支持并不完整,但大多数方法都已实现。