2015-02-11 21 views
1

我正在使用Spark與Scala並試圖使用JdbcRDD從數據庫獲取數據。沒有'?'的JDBC RDD查詢語句

val rdd = new JdbcRDD(sparkContext, 
    driverFactory, 
    testQuery, 
    rangeMinValue.get, 
    rangeMaxValue.get, 
    partitionCount, 
    rowMapper) 
    .persist(StorageLevel.MEMORY_AND_DISK)  

在查詢中沒有?值設置(因爲查詢很長,我不會把它放在這裏)。所以我得到一個錯誤說,

java.sql.SQLException:參數索引超出範圍(1>參數的數量,它是0)。

我不知道是什麼問題。有人可以提出任何類型的解決方案?

回答

1

你的問題是Spark期望你的查詢字符串有幾個?參數。

從火花用戶列表:

爲了火花分割並行JDBC查詢時,它期待一個 上限和下限爲輸入數據,以及一些 分區,以便它可以跨多個任務分割查詢。

例如,根據您的數據分發,你可以設置一個 上,您的時間戳範圍下限,和火花應該 能夠創建新的子查詢拆分數據。

另一個選項是使用HadoopInputFormat 類作爲NewHadoopRDD加載整個表。

+0

因此,如果我將它設置爲JdbcRDD構造函數中的一個分區,那麼對於使用單個分區處理特定查詢的情況下,它將不會拆分它,並且邊界將是最小值和最大值? @gasparms – igalbenardete 2015-02-11 11:51:19

+0

我不明白,如果你想讓Spark取最小值和最大值,你應該創建一個類似於「SELECT * FROM student_info WHERE id> =?AND id <=?」的查詢。 ?將被最小值和最大值替換。 – gasparms 2015-02-11 15:24:43

2

得到了同樣的問題。 使用這樣的:

SELECT * FROM tbl WHERE ... AND ? = ? 

然後用下界1,較高的鍵合1和分區1. 呼叫,它將始終運行只有一個分區。