使用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-core
和 spark-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 服务器连接到 MS SQL Server
通过 Oracledb Driver 使用 Nodejs 连接到远程 Oracle DB