如何在 Bluemix 中将 SQL 数据库加载到 Analytics for Apache Spark?
Posted
技术标签:
【中文标题】如何在 Bluemix 中将 SQL 数据库加载到 Analytics for Apache Spark?【英文标题】:How to load SQL Database into Analytics for Apache Spark within Bluemix? 【发布时间】:2016-01-28 17:27:00 【问题描述】:我已将 SQL 数据库和 Spark 添加到我的应用程序中,并已成功将数据导入数据库。
现在我正在尝试将这些数据加载到 Spark 中,以便使用 JDBC 进行处理。我已经通过 Spark Data 选项卡连接了数据库,并通过以下方式将其作为源导入 Spark 数据源 .数据库从“连接应用程序”选项卡中为我提供了以下 SSL 字符串
jdbc:db2://75.126.155.153:50001/SQLDB:securityMechanism=9
或更多specifically
我尝试使用 Spark 连接(用 Scala 编写)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val driver = "com.ibm.db2.jcc.DB2Driver"
Class.forName(driver)
val data = sqlContext.load("jdbc", Map( "url" -> " jdbc:db2://75.126.155.153:50001/SQLDB:securityMechanism=9", "dbtable" -> "HAWAII"))
但是,我收到以下错误
Name: java.sql.SQLException
Message: No suitable driver found for jdbc:db2://75.126.155.153:50001/SQLDB:securityMechanism=9
StackTrace: java.sql.DriverManager.getConnection(DriverManager.java:608)
java.sql.DriverManager.getConnection(DriverManager.java:199)
org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:118)
org.apache.spark.sql.jdbc.JDBCRelation.<init>(JDBCRelation.scala:128)
org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:113)
org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:269)
org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)
org.apache.spark.sql.SQLContext.load(SQLContext.scala:1253)
$line18.$read$$iwC$$iwC$$iwC$$iwC.<init>(<console>:16)
$line18.$read$$iwC$$iwC$$iwC.<init>(<console>:21)
$line18.$read$$iwC$$iwC.<init>(<console>:23)
$line18.$read$$iwC.<init>(<console>:25)
$line18.$read.<init>(<console>:27)
$line18.$read$.<init>(<console>:31)
$line18.$read$.<clinit>(<console>)
java.lang.J9VMInternals.initializeImpl(Native Method)
java.lang.J9VMInternals.initialize(J9VMInternals.java:235)
$line18.$eval$.<init>(<console>:7)
$line18.$eval$.<clinit>(<console>)
java.lang.J9VMInternals.initializeImpl(Native Method)
java.lang.J9VMInternals.initialize(J9VMInternals.java:235)
$line18.$eval.$print(<console>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
java.lang.reflect.Method.invoke(Method.java:620)
org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
com.ibm.spark.interpreter.ScalaInterpreter$$anonfun$interpretAddTask$1$$anonfun$apply$3.apply(ScalaInterpreter.scala:296)
com.ibm.spark.interpreter.ScalaInterpreter$$anonfun$interpretAddTask$1$$anonfun$apply$3.apply(ScalaInterpreter.scala:291)
com.ibm.spark.global.StreamState$.withStreams(StreamState.scala:80)
com.ibm.spark.interpreter.ScalaInterpreter$$anonfun$interpretAddTask$1.apply(ScalaInterpreter.scala:290)
com.ibm.spark.interpreter.ScalaInterpreter$$anonfun$interpretAddTask$1.apply(ScalaInterpreter.scala:290)
com.ibm.spark.utils.TaskManager$$anonfun$add$2$$anon$1.run(TaskManager.scala:123)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627)
java.lang.Thread.run(Thread.java:801)
我已经搜索过这个错误,this 回答说我需要导入驱动程序 jar,但是我已经尝试过
%AddJar
但是它给出了同样的错误。有什么想法吗?
【问题讨论】:
假设您的%addJar
和驱动程序版本本身没有问题,请尝试将驱动程序名称添加到属性映射 - Map( "url" -> " ... "driver" -> driver, "dbtable" -> "HAWAII")
我添加了驱动参数并且没有骰子。但是,我搜索了一下,发现this。不过感谢您的建议!
【参考方案1】:
终于明白了...我相信我使用的是 Spark load() 函数的已弃用版本。 This API 让我觉得它已经过时了……尤其是当笔记本说它的版本是 Spark 1.4 时。
回答
看here 得到了非常详细的代码结构答案。代码应该是
val url = "jdbc:db2://75.126.155.153:50000/SQLDB"
val prop = new java.util.Properties
prop.setProperty("user","username")
prop.setProperty("password","xxxxxx")
val test = sqlContext.read.jdbc(url,"HAWAII",prop)
【讨论】:
【参考方案2】:您需要在加载方法中提供驱动程序。 你可以试试这个吗?
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val tmpdata1= sqlContext.load("jdbc", Map(
"url" -> "jdbc:db2://75.126.155.153:50000/SQLDB:securityMechanism=9;currentSchema=USER13878;user=<ur-username>;password=xxxxx;",
"driver" -> "com.ibm.db2.jcc.DB2Driver",
"dbtable" -> "USER13878.MYTABLE"))
谢谢, 查尔斯。
【讨论】:
感谢您的帮助,查尔斯。我想通了!以上是关于如何在 Bluemix 中将 SQL 数据库加载到 Analytics for Apache Spark?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的本地机器中对“SQL 数据库/Bluemix”进行编目?
Bluemix 中的 PHP 应用程序如何使用 SQL 数据库服务?
在 Bluemix SQL 数据库中启用 Spatial Extender