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

时间:2017-01-12 11:04:21

标签: java apache-spark apache-spark-sql apache-spark-mllib apache-spark-dataset

下面是我用来从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>

2 个答案:

答案 0 :(得分:0)

您拥有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项目中构建的此功能

答案 1 :(得分:0)

您应该在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);