无法从Spark访问sqlite数据库

时间:2016-04-21 19:03:27

标签: java scala apache-spark spark-dataframe

我有以下代码:

val conf = new SparkConf().setAppName("Spark Test")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val data = sqlContext.read.format("jdbc").options(
  Map(
    "url" -> "jdbc:sqlite:/nv/pricing/ix_tri_pi.sqlite3",
    "dbtable" -> "SELECT security_id FROM ix_tri_pi")).load()

data.foreach {
  row => println(row.getInt(1))
}

我尝试提交:

spark-submit \
  --class "com.novus.analytics.spark.SparkTest" \ 
  --master "local[4]" \
 /Users/smabie/workspace/analytics/analytics-spark/target/scala-2.10/analytics-spark.jar \
  --conf spark.executer.extraClassPath=sqlite-jdbc-3.8.7.jar \
  --conf  spark.driver.extraClassPath=sqlite-jdbc-3.8.7.jar \
  --driver-class-path sqlite-jdbc-3.8.7.jar \
  --jars sqlite-jdbc-3.8.7.jar

但我得到以下例外:

Exception in thread "main" java.sql.SQLException: No suitable driver

我正在使用Spark版本1.6.1,如果有帮助的话。 谢谢!

2 个答案:

答案 0 :(得分:1)

尝试将jar定义为spark-submit的最后一个参数。

答案 1 :(得分:0)

您是否尝试明确指定选项中的驱动程序类?

options(
  Map(
    "url" -> "jdbc:sqlite:/nv/pricing/ix_tri_pi.sqlite3",
    "driver" -> "org.sqlite.JDBC",
    "dbtable" -> "SELECT security_id FROM ix_tri_pi"))

尝试加载PostgreSQL表时遇到了类似的问题。

另外,可能的原因可能是在类加载中:

  

JDBC驱动程序类必须对原始类加载器可见   在客户端会话和所有执行程序上。这是因为Java的   DriverManager类执行安全检查,导致它忽略   一个人去的时候,所有的驱动程序对原始类加载器都不可见   打开连接。一种方便的方法是修改   所有工作节点上的compute_classpath.sh包含您的驱动程序JAR。

http://spark.apache.org/docs/latest/sql-programming-guide.html#troubleshooting