2016-03-01 54 views
1

我試圖使用Spark數據源API從Oracle數據庫加載數據。從Oracle加載的Spark SQLContext數據源API

因爲我需要通過查詢來加載數據,我用下面這是我從一些在線的例子放在一起查詢:

Map<String, String> options = new HashMap<>(); 
options.put("driver", MYSQL_DRIVER); 
options.put("user", MYSQL_USERNAME); 
options.put("password", MYSQL_PWD); 
options.put("url", MYSQL_CONNECTION_URL); 
options.put("dbtable", "(select emp_no, emp_id from employees) as employees_data"); 
options.put("lowerBound", "10001"); 
options.put("upperBound", "499999"); 
options.put("numPartitions", "10"); 

DataFrame jdbcDF = sqlContext.load("jdbc", options); 

這得到一個例外:

異常線程「main 「java.sql.SQLSyntaxErrorException:ORA-00933:SQL命令不能正確地結束

我懷疑,我們不能放棄 」爲employees_data「 爲Oracle查詢,所以我做錯了什麼?

+0

您的代碼有一個像MYSQL_DRIVER參考;你真的連接到Oracle數據庫或MySQL數據庫嗎? –

+0

對不起,我忘了更改變量名...變量中的值使用Oracle驅動程序private static final String MYSQL_DRIVER =「oracle.jdbc.OracleDriver」; private static final String MYSQL_USERNAME =「qauser」; private static final String MYSQL_PWD =「qauser」; private static final String MYSQL_CONNECTION_URL =「jdbc:oracle:thin:@ //」; – prakash

回答

2

我懷疑,我們不能放棄「爲employees_data」爲Oracle查詢

您可能會懷疑這一點,但你不能在Oracle表別名使用AS。您可以爲列別名,它是可選的,但不允許用於表別名。你可以看到in the syntax diagram

假設星火不介意別名本身,你可以刪除AS

options.put("dbtable", "(select emp_no, emp_id from employees) employees_data"); 
+0

更糟的是,他試圖用括號括起整個結果集! 「(從僱員中選擇emp_no,emp_id)作爲employees_data」 –

+0

@MichaelBroughton - 我認爲沒問題,[來自Spark文檔](https://spark.apache.org/docs/latest/sql-programming-guide。 HTML); 'dbtable'條目表示它可以是任何可以在'from'子句中的「而不是一個完整的表格,你也可以在括號中使用一個子查詢」,所以這在這個基礎上是可以的。不確定這個別名是否真的有用。 –

+0

如果它將該字符串傳遞給Oracle,那麼我將得到與「(從雙選中選擇1)相同的ORA-00933錯誤」mydual「 –

0

試試這個...

Map < String, String > oracle_options = new HashMap<>() 
oracle_options.put("driver", "oracle.jdbc.OracleDriver"); 
oracle_options.put("url", "jdbc:oracle:thin:username/[email protected]//hostName/instanceName); 
oracle_options.put("dbtable", "tableName"); 
DataFrame dataFrame = hContext.read().format("jdbc").options(oracle_options).load().select(String col1,String col2.....)); 

哪裏hContext是HiveContex實例。 如果您使用的選擇裝置,其中使用的條件如下:

DataFrame dataFrame = hContext.read().format("jdbc").options(oracle_options).load().select(String col1,String col2.....)).where(String expr);