当前位置: 首页 > 知识库问答 >
问题:

Spark Sql连接

朱英范
2023-03-14


我正在尝试将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中。阅读格式('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\u gateway.py”,第1285行,在调用文件“C:\Hadoop\Spark-3.0.0.0-2-bin\py4j\Py8py\Py2b\py4j.py\Py8py\Py2py\Py2py\Py2py”中,在第326行的deco文件“C:\Hadoop\Spark\Spark-3.0.0-preview2-bin-hadoop2.7\python\lib\py4j-0.10.8.1-src.zip\py4j\protocol.py”中,获取返回值py4j。协议Py4JJavaError:调用o29时出错。负载:JAVAlang.ClassNotFoundException:C:\Hadoop\drivers\ojdbc14。jar在java。网1美元。在java上运行(未知源代码)。网1美元。在java上运行(未知源代码)。安全访问控制器。java上的doPrivileged(本机方法)。网URLClassLoader。java上的findClass(未知源代码)。lang.ClassLoader。java上的loadClass(未知源代码)。lang.ClassLoader。组织上的loadClass(未知源)。阿帕奇。火花sql。处决数据源。jdbc。DriverRegistry$。在org上注册(DriverRegistry.scala:45)。阿帕奇。火花sql。处决数据源。jdbc。jdbc选项$anonfun$driverClass$1(jdbchoptions.scala:99)位于org。阿帕奇。火花sql。处决数据源。jdbc。jdbc选项$anonfun$driverClass$1$adapted(jdbchoptions.scala:99)位于org。阿帕奇。火花sql。处决数据源。jdbc。JDBCOptions$$Lambda$729/1345147223。在scala应用(未知源)。选项foreach(Option.scala:407)位于org。阿帕奇。火花sql。处决数据源。jdbc。jdbc选项。(jdbchoptions.scala:99)在org上。阿帕奇。火花sql。处决数据源。jdbc。jdbc选项。(jdbchoptions.scala:35)在org上。阿帕奇。火花sql。处决数据源。jdbc。JdbcRelationProvider。在org上创建关系(jdbcreationprovider.scala:32)。阿帕奇。火花sql。处决数据源。数据源。resolveRelation(DataSource.scala:339)位于org。阿帕奇。火花sql。DataFrameReader。在org上加载v1source(DataFrameReader.scala:240)。阿帕奇。火花sql。DataFrameReader$anonfun$load$2(DataFrameReader.scala:229)位于org。阿帕奇。火花sql。DataFrameReader$$Lambda$719/1893144191。在scala应用(未知源)。选项getOrElse(Option.scala:189)位于org。阿帕奇。火花sql。DataFrameReader。在org上加载(DataFrameReader.scala:229)。阿帕奇。火花sql。DataFrameReader。在sun上加载(DataFrameReader.scala:179)。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(未知源)。反映DelegatingMethodAccessorImpl。在java上调用(未知源代码)。朗,反思一下。方法在py4j调用(未知源)。反射MethodInvoker。在py4j上调用(MethodInvoker.java:244)。反射反射引擎。在py4j上调用(ReflectionEngine.java:357)。网关。在py4j上调用(Gateway.java:282)。命令。抽象命令。py4j上的invokeMethod(AbstractCommand.java:132)。命令。呼叫命令。在py4j上执行(CallCommand.java:79)。网关连接。在java上运行(GatewayConnection.java:238)。朗。丝线。运行(未知源)

共有1个答案

南宫凯康
2023-03-14

发现了问题。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()
 类似资料:
  • 此外,它在spark cassandra Connector1.4中工作,但不是与最新的cassandra Connector1.6.0-M1一起工作。请让我知道这个问题

  • 问题内容: 我在此DataBricks帖子中看到,SparkSql支持窗口函数,特别是我正在尝试使用lag()窗口函数。 我有几行信用卡交易,并且已经对它们进行了排序,现在我要遍历各行,并为每一行显示交易金额,以及当前行金额与上一行金额的差额。 在DataBricks帖子之后,我提出了这个查询,但是它给我抛出了一个异常,我无法理解为什么。 这是在PySpark中。tx是我在注册为临时表时创建的数据

  • 我在hdfs之上使用sparksql。 每个hdfs节点都运行一个spark从节点。 当我运行大型查询时,hdfs似乎在节点之间向spark从节点发送数据。 为什么hdfs不使用本地数据为本地spark提供服务? 所有任务都显示本地级别。 我甚至设置了spark.locality.wait=10000。 有什么遗漏或需要查看的吗? 谢谢,

  • <code>Spark</code>版本为1.3.0。 来自< code > sqlcontext . Scala (https://github . com/Apache/spark/blob/master/SQL/core/src/main/Scala/org/Apache/spark/SQL/sqlcontext . Scala)的源代码: 我真的不能理解上面的代码。 是如何工作的? (_)

  • 问题内容: 我将RDD [myClass]转换为数据框,然后将其注册为SQL表 该表是可调用的,可以用以下命令演示 但是下一步给出了错误,说表未找到:my_rdd Spark的新手。 不明白为什么会这样。有人可以帮我吗? 问题答案: 确保从相同的SQLContext导入hidden._。临时表在一个特定的SQLContext中保留在内存中。

  • 我将RDD[myClass]转换为dataframe,然后将其注册为SQL表 此表是可调用的,可以使用以下命令演示 对Spark来说是个新手。不明白为什么会这样。有谁能帮我摆脱这一切吗?

  • 我正在从Impala迁移到SparkSQL,使用以下代码读取一个表: 我如何调用上面的SparkSQL,这样它就可以返回这样的东西:

  • 这些查询是:select*from t1 where col1='123'[t1由col1 bucketted]select*from t1 where col2='123'[col2不是bucketting列]我的问题是 > 如何确定在查询执行期间正在进行全表扫描还是正在进行相关的部分表扫描? 我能从DAG或物理计划中得到任何信息吗?我两个都看过,但我看不出有什么不同,就像我在物理计划中看到的那