2016-04-21 79 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