Spark Sql 连接

Spark Sql Connection


我正在尝试将 spark 与 pyspark 中的 oracle 数据库连接起来,但出现驱动程序错误,有人可以帮我解决这个问题。我是 Spark 的新手,刚开始学习。下面是我的代码,

import pyspark

sc = pyspark.SparkContext('local[*]')
SqlContext = pyspark.SQLContext(sc)
Driver = 'C:\Hadoop\drivers\ojdbc14.jar'
OracleConnection = 'jdbc:oracle:thin:hr/hr@localhost:1521/xe'
Query = 'select * from employees'
OrcDb = SqlContext.read.format('jdbc') \
    .option('url', OracleConnection) \
    .option('dbtable', Query) \
    .option('driver', Driver) \
    .load()

OrcDb.printSchema()

下面是错误,

文件 "C:/Users/Macaulay/PycharmProjects/Spark/SparkSqlOracle.py",第 8 行,位于 OrcDb = SqlContext.read.format('jdbc') \ 文件 "C:\Hadoop\Spark\spark-3.0.0-preview2-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\sql\readwriter.py",第 166 行,加载中 文件 "C:\Hadoop\Spark\spark-3.0.0-preview2-bin-hadoop2.7\python\lib\py4j-0.10.8.1-src.zip\py4j\java_gateway.py",第 1285 行,在 call 中 文件 "C:\Hadoop\Spark\spark-3.0.0-preview2-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\sql\utils.py",第 98 行,deco 文件 "C:\Hadoop\Spark\spark-3.0.0-preview2-bin-hadoop2.7\python\lib\py4j-0.10.8.1-src.zip\py4j\protocol.py",第 326 行,在 get_return_value 中 py4j.protocol.Py4JJavaError:调用 o29.load 时发生错误。 : java.lang.ClassNotFoundException: C:\Hadoop\drivers\ojdbc14.jar 在 java.net.URLClassLoader$1.run(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(来源不明) 在 java.lang.ClassLoader.loadClass(来源不明) 在 org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:45) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverClass$1(JDBCOptions.scala:99) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverClass$1$adapted(JDBCOptions.scala:99) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$Lambda$729/1345147223.apply(来源不明) 在 scala.Option.foreach(Option.scala:407) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.(JDBCOptions.scala:99) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.(JDBCOptions.scala:35) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32) 在 org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:339) 在 org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:240) 在 org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:229) 在 org.apache.spark.sql.DataFrameReader$$Lambda$719/1893144191.apply(来源不明) 在 scala.Option.getOrElse(Option.scala:189) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:229) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:179) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明) 在 java.lang.reflect.Method.invoke(来源不明) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:238) 在 java.lang.Thread.run(来源不明)

发现问题。 JDBC 驱动应该放在 Spark Jar 目录下 而不是提供驱动的路径,我们必须提供驱动的服务名称。这种方法解决了这个问题。

下面是代码,

import pyspark
from pyspark.sql.session import SparkSession

sc = pyspark.SparkContext('local[*]')
SqlContext = pyspark.SQLContext(sc)
spark = SparkSession(sc)
Driver = 'oracle.jdbc.driver.OracleDriver'   # Driver's service name
OracleConnection = 'jdbc:oracle:thin:@//localhost:1521/xe'
User = 'hr'
Password = 'hr'
Query = 'select * from employees'
OrcDb = spark.read.format('jdbc') \
    .option('url', OracleConnection) \
    .option('dbtable', Query) \
    .option('user', User) \
    .option('Password', Password) \
    .option('driver', Driver) \
    .load()
OrcDb.printSchema()