sparkSQL以JDBC为数据源

摘要:
--Oracle jdbc驱动程序--˃com。oracleojdbc511.2.0.1.0˂/version&
一、环境准备

安装oracle后,创建测试表、数据:

  1. createtabletest(
  2. usernamevarchar2(32)primarykey,
  3. passwordvarchar2(32)
  4. );
  5. insertintotestvalues('John','1234');
  6. insertintotestvalues('Mike','1234');
  7. insertintotestvalues('Jim','1234');
  8. insertintotestvalues('Ana','1234');
  9. insertintotestvalues('Ennerson','1234');
  10. commit;

二、实现代码

1、建立JDBC连接读取数据

  1. SparkConfsparkConf=newSparkConf().setAppName("JavaSparkSQL").setMaster("local[6]");
  2. JavaSparkContextjsc=newJavaSparkContext(sparkConf);
  3. SQLContextsqlContext=newSQLContext(jsc);
  4. Map<String,String>options=newHashMap<String,String>();
  5. options.put("url","jdbc:oracle:thin:@192.168.168.100:1521/orcl");
  6. options.put("user","flume");
  7. options.put("password","1234");
  8. //读取test表
  9. options.put("dbtable","test");
  10. Dataset<Row>df=sqlContext.read().format("jdbc").options(options).load();
  11. df.show();
  12. /*+--------+--------+
  13. |USERNAME|PASSWORD|
  14. +--------+--------+
  15. |John|1234|
  16. |Mike|1234|
  17. |Jim|1234|
  18. |Ana|1234|
  19. |Ennerson|1234|
  20. +--------+--------+*/

2、遍历Dataset<Row>集合

  1. //遍历Dataset<Row>集合
  2. List<Row>list=df.collectAsList();
  3. //读取test表中username字段的数据
  4. for(inti=0;i<list.size();i++){
  5. System.out.println(list.get(i).<String>getAs("USERNAME"));
  6. }
  7. /*John
  8. Mike
  9. Jim
  10. Ana
  11. Ennerson*/

3、执行SQL语句

  1. //执行sql语句
  2. //一定要有df.createOrReplaceTempView("test");否则会报
  3. //“Exceptioninthread"main"org.apache.spark.sql.AnalysisException:Tableorviewnotfound:test;line1pos0”
  4. df.createOrReplaceTempView("test");
  5. sqlContext.sql("insertintotestvalues('Obama','6666')");

4、引入spark-sql依赖包

在pom.xml文件中引入sparksql依赖包

  1. <!--https://mvnrepository.com/artifact/org.apache.spark/spark-sql_2.11-->
  2. <dependency>
  3. <groupId>org.apache.spark</groupId>
  4. <artifactId>spark-sql_2.11</artifactId>
  5. <version>2.1.1</version>
  6. <scope>runtime</scope>
  7. </dependency>
三、No suitable driver解决

1、在Eclipse上运行报Exception in thread "main" java.sql.SQLException: No suitable driver错误:

  1. Exceptioninthread"main"java.sql.SQLException:Nosuitabledriveratjava.sql.DriverManager.getDriver(DriverManager.java:315)atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)atscala.Option.getOrElse(Option.scala:121)atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:83)atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:34)atorg.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)atorg.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:330)atorg.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)atorg.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:125)atcom.spark.test.JavaSparkSQL.main(JavaSparkSQL.java:26)

原因是没有引用oracle的jdbc驱动包,配置pom.xml文件如下:

  1. <!--oraclejdbc驱动-->
  2. <dependency>
  3. <groupId>com.oracle</groupId>
  4. <artifactId>ojdbc5</artifactId>
  5. <version>11.2.0.1.0</version>
  6. <scope>runtime</scope>
  7. </dependency>

由于Oracle授权问题,Maven不提供oracleJDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库。

具体可以参考:maven添加oracle jdbc依赖

2、在spark集群环境上运行报Exception in thread "main" java.sql.SQLException: No suitable driver错误:

  1. Exceptioninthread"main"java.sql.SQLException:Nosuitabledriver
  2. atjava.sql.DriverManager.getDriver(DriverManager.java:315)
  3. atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
  4. atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
  5. atscala.Option.getOrElse(Option.scala:121)
  6. atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:83)
  7. atorg.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:34)
  8. atorg.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)
  9. atorg.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:330)
  10. atorg.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
  11. atorg.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:125)
  12. atcom.spark.main.JavaLocalDirectKafkaSparkSQLCarNumber.main(JavaLocalDirectKafkaSparkSQLCarNumber.java:117)
  13. atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
  14. atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  15. atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  16. atjava.lang.reflect.Method.invoke(Method.java:498)
  17. atorg.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:743)
  18. atorg.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
  19. atorg.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
  20. atorg.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
  21. atorg.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
  1. cd/usr/local/spark/spark-2.1.1-bin-hadoop2.7;
  2. bin/spark-submit
  3. --masterspark://master:7077
  4. --class"com.spark.main.JavaLocalDirectKafkaSparkSQLCarNumber"
  5. myApp/test-0.0.1-SNAPSHOT-jar-with-dependencies.jar;

需要在spark集群环境上,指定对应的jdbc驱动包:--driver-class-path myApp/ojdbc5.jar

  1. cd/usr/local/spark/spark-2.1.1-bin-hadoop2.7;
  2. bin/spark-submit
  3. --driver-class-pathmyApp/ojdbc5.jar
  4. --masterspark://master:7077
  5. --class"com.spark.main.JavaLocalDirectKafkaSparkSQLCarNumber"
  6. myApp/test-0.0.1-SNAPSHOT-jar-with-dependencies.jar;

sparkSQL以JDBC为数据源第1张

再次运行,成功!!!

免责声明:文章转载自《sparkSQL以JDBC为数据源》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Apache Hudi使用问题汇总(一)pytorch Model Linear实现线性回归CUDA版本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java.net.UnknownHostException异常处理

1.问题描述   最近迁移环境,在Linux系统下部署Java产品的应用,后台报出如下异常,系统报找不到名为“xxx-houtai1”的主机: 1 java.net.UnknownHostException: xxx-houtai1: xxx-houtai1 2 at java.net.InetAddress.getLocalHost...

在Mac OS X下使用Apache、PHP、MySQL、Netbeans、Yii

本文环境: Mac OS X:10.8.4 Apache:2.2.22 PHP:5.3.15 Netbeans:7.3.1 Yii:1.1.14   Mac OS X是内置了Apache服务器的,不过默认没有启动。之前的版本有两种方式启动Apache,到了Mac OS X 10.8似乎只能用命令行的方式启动了。10.8.4版本中的Apache是2.2.22...

Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户评论/关注/点赞时能够通知到被评论/关注/点赞的用户,并...

Apache与Nginx优缺点比较

本文来源:收集、整理自互联网 1、nginx相对于apache的优点:轻量级,同样起web服务,比apache 占用更少的内存及资源抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单 社区活跃,各种高性能模块出品迅速 apache相对于nginx的优点...

php curl模块开启失败解决参考

  现在公司的测试项目和正式项目是部署在同一台服务器上的,为了在重启apache时互不影响,我在服务器上部署了两个apache服务,使用nginx做url转发。   结果正式环境的项目使用curl没有问题,但是测试环境,也就是新安装的apache服务,使用curl的时候就报错,查看php.ini也发现curl模块已开启,但是使用phpinfo时,看到cur...

Spark(十六)DataSet

  Spark最吸引开发者的就是简单易用、跨语言(Scala, Java, Python, and R)的API。 本文主要讲解Apache Spark 2.0中RDD,DataFrame和Dataset三种API;它们各自适合的使用场景;它们的性能和优化;列举使用DataFrame和DataSet代替RDD的场景。本文聚焦DataFrame和Datase...