2016-10-12 84 views
7

我們發現使用Spark 1.3的API從Oracle數據庫加載數據一直很慢,因爲Spark 1.3一直到目前的Spark 2.0.1。典型的代碼是什麼在Java中是這樣的:爲什麼Oracle的Spark查詢(加載)與SQOOP相比較慢?

 Map<String, String> options = new HashMap<String, String>(); 
     options.put("url", ORACLE_CONNECTION_URL); 
     options.put("dbtable", dbTable); 
     options.put("batchsize", "100000"); 
     options.put("driver", "oracle.jdbc.OracleDriver"); 

     Dataset<Row> jdbcDF = sparkSession.read().options(options) 
       .format("jdbc") 
       .load().cache(); 
     jdbcDF.createTempView("my"); 

     //= sparkSession.sql(dbTable); 
     jdbcDF.printSchema(); 
     jdbcDF.show(); 

     System.out.println(jdbcDF.count()); 

我們的一位成員曾試圖自定義這個部分,他當時(火花1.3.0)提高了很多。但Spark核心代碼的某些部分成爲Spark的內部,因此在版本之後不能使用它。另外,我們看到HADOOP的SQOOP比Spark更快(但它寫入HDFS,需要將大量工作轉換爲Spark使用的數據集)。使用Spark的數據集寫入方法寫入Oracle對我們來說似乎很好。令人費解的是,爲什麼會發生這種事

+1

得到了解決:options.put( 「BATCHSIZE」, 「100000」)應options.put更換( 「FETCHSIZE」, 「100000」)。 –

+2

@PauZWu:作爲一個解決方案添加,因爲它值得 –

+0

請做@PauZWu我想獎勵賞金:) –

回答

2

@Pau Z Wu已經在評論中回答了問題,但問題是options.put("batchsize", "100000");這需要是options.put("fetchsize", "100000");,因爲提取大小處理限制一次從數據庫中檢索的行數,並且最終會使負載時間更快。

更多信息可以在這裏找到:https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm

+0

由於Pau Z Wu似乎並沒有興趣回答賞金是你的。 –

相關問題