使用Spark查询Oracle DB时出现“ORA-00933:SQL命令未正确结束”错误

时间:2016-03-01 18:22:47

标签: oracle scala hadoop apache-spark

我正在尝试使用Spark数据源API从Oracle数据库加载数据。

由于我需要通过查询加载数据,因此我使用下面的查询,我从在线的一些示例中汇总了这些查询:

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命令未正确结束

我怀疑我们不能为Oracle查询提供“as employees_data”,所以我做错了什么?

2 个答案:

答案 0 :(得分:3)

  

我怀疑我们不能作为employee_data&#34;用于Oracle查询

您可能会怀疑它,但您无法在Oracle中使用AS作为表别名。您可以使用列别名,它是可选的,但不允许表别名。您可以看到in the syntax diagram

假设Spark并不介意别名本身,您只需删除AS

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

答案 1 :(得分:0)

试试这个......

Map < String, String > oracle_options = new HashMap<>()
oracle_options.put("driver", "oracle.jdbc.OracleDriver");
oracle_options.put("url", "jdbc:oracle:thin:username/password@//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);