2016-04-21 81 views
2

访问的SQLite数据库我有以下代码:无法从星火

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,如果有帮助。 谢谢!

+0

“/ nv/pricing/ix_tri_pi.sqlite3”是数据库的绝对路径吗?另外尝试将你的jar定义为'spark-submit'的最后一个参数。 –

+0

我真的不能相信这个工作。谢谢一堆。为什么地球上的命令行参数的顺序不是“spark_submit”不可知的?坦率地说,这让我感到绝对荒谬...... – sturm

+0

“为什么地球上不会有关于命令行参数顺序的spark_submit不可知论?”这是[标准](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html):选项首先选择,参数不是选项后面的选项。特别是,这允许使用'--'分隔操作数。 –

回答

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