使用java将oracle数据库连接到apache spark时出错

Posted

技术标签:

【中文标题】使用java将oracle数据库连接到apache spark时出错【英文标题】:Error in connecting oracle database to apache spark using java 【发布时间】:2017-01-12 11:04:21 【问题描述】:

下面是我用来从 apache spark java 程序连接到 oracle 本地数据库的代码,但是我遇到了以下错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/Logging
at java.lang.ClassLoader.defineClass1(Native Method).

这是我的代码。

public static void main( String[] args ) 
  JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("SparkJdbcDs").setMaster("local[*]"));
  SQLContext sqlContext = new SQLContext(sc);
  Map<String, String> options = new HashMap<String, String>();
  options.put("url", "jdbc:oracle:thin:@//192.168.2.85:1521/stage");
  options.put("dbtable", "AD_TABLES.brands");
  DataFrame jdbcDF = sqlContext.read().format("jdbc").options(options).load();

下面是 POM 文件。

<dependency>
  <groupId>com.databricks</groupId>
  <artifactId>spark-csv_2.11</artifactId>
  <version>1.5.0</version>
</dependency>
<dependency>
  <groupId>com.univocity</groupId>
  <artifactId>univocity-parsers</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-mllib_2.11</artifactId>
  <version>2.0.1</version>
</dependency>
<dependency> 
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.11</artifactId>
  <version>2.0.1</version>
 </dependency>
 <dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_2.11</artifactId>
  <version>1.6.1</version>
 </dependency>
 <dependency>
  <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0.3</version>
 </dependency>

【问题讨论】:

你能把堆栈跟踪放在这里吗?运行时您设置的类路径中似乎缺少某些类。 Resolving ClassNotFoundException exceptions / object x is not a member of package y in Apache Spark的可能重复 【参考方案1】:

您拥有 Spark SQL 1.6 版和 Spark Core 2.0

将 Spark SQL 版本也更改为 2.0:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.0.1</version>
</dependency>

Spark-CSV 也仅适用于 Spark 1.x,Spark 2 在 SQL 项目中内置了此功能

【讨论】:

【参考方案2】:

您应该在 pom.xml 中使用相同版本的 spark 库。您使用的是 spark-corespark-mllib 版本为 2.0.1,而您的 spark-sql 版本为 1.6.1。将其更改为 2.0.1,如下所示。

 <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.0.1</version>
 </dependency>

使用 Spark 2.0,您无需创建单独的 sqlContext,因为您可以使用 SparkSession,如下所示。

SparkSession spark = SparkSession
  .builder()
  .appName("JDBCSample")
  .master("local[2]")
  .getOrCreate(); 

现在您可以使用 SparkSession 从数据库中读取数据,如下所示。更多详情请查看here。

Properties connectionProperties = new Properties();
connectionProperties.put("user", "username");
connectionProperties.put("password", "password");
Dataset<Row> jdbcDF2 = spark.read().jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);

【讨论】:

我快了 30 秒 ^^ 我的答案暗示了 Spark CSV,你的答案暗示了 SparkSession

以上是关于使用java将oracle数据库连接到apache spark时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 连接到 Oracle 数据库

将ColdFusion 8连接到Oracle 12c

使用 Java 从 Oracle 服务器连接到 MS SQL Server

通过 Oracledb Driver 使用 Nodejs 连接到远程 Oracle DB

可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?

无法使用 SSO 钱包将 Oracle 与 Apache Spark 连接