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

使用Spark查询Oracle数据库时出现“ORA-00933:SQL命令未正确结束”错误,oracle,scala,hadoop,apache-spark,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); opt

我试图使用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);
这将获得一个异常:

主线程java.sql.SQLSyntaxErrorException:ORA-00933:sql命令中的异常未正确结束

我怀疑我们不能为Oracle查询提供as EMPLOYEE_数据,那么我做错了什么

我怀疑我们不能为Oracle查询提供as employees_数据

您可能对此表示怀疑,但在Oracle中不能将AS用作表别名。您可以选择列别名,其中列别名是可选的,但表别名不允许。你可以看到

假设Spark不介意别名本身,您只需删除以下内容:

我怀疑我们不能为Oracle查询提供as employees_数据

您可能对此表示怀疑,但在Oracle中不能将AS用作表别名。您可以选择列别名,其中列别名是可选的,但表别名不允许。你可以看到

假设Spark不介意别名本身,您只需删除以下内容:

试试这个

试试这个


您的代码有类似MYSQL\u驱动程序的引用;您是真的连接到Oracle数据库还是MySQL数据库?对不起,我忘了更改变量名。。。变量中的值使用Oracle drivers私有静态最终字符串MYSQL\u DRIVER=Oracle.jdbc.OracleDriver;私有静态最终字符串MYSQL_USERNAME=qauser;私有静态最终字符串MYSQL_PWD=qauser;私有静态最终字符串MYSQL_CONNECTION_URL=jdbc:oracle:thin:@/;您的代码有类似MYSQL\u驱动程序的引用;您是真的连接到Oracle数据库还是MySQL数据库?对不起,我忘了更改变量名。。。变量中的值使用Oracle drivers私有静态最终字符串MYSQL\u DRIVER=Oracle.jdbc.OracleDriver;私有静态最终字符串MYSQL_USERNAME=qauser;私有静态最终字符串MYSQL_PWD=qauser;私有静态最终字符串MYSQL_CONNECTION_URL=jdbc:oracle:thin:@/;更糟糕的是,他试图用这些括号为整个结果集添加别名!选择emp_no,emp_id from employees as employees_data@MichaelBroughton-我想没关系;dbtable条目表示它可以是from子句中的任何内容,也可以使用括号中的子查询来代替完整表,因此在这个基础上这是可以的。但不确定别名是否真的有用。但我以前从未使用过或见过它……如果它将该字符串传递给Oracle,我将从dual as中选择1得到相同的ORA-00933错误mydual@AlexPoole如果我不将别名用作employees_数据,spark会在线程main java.sql.SQLSyntaxErrorException:ORA-00903:无效表名中给出异常,我已经使用JdbcRDD测试了这个查询,因为JdbcRDD不适合数据源API@prakash-当您删除as时会发生什么?更糟糕的是,他试图用这些括号为整个结果集别名!选择emp_no,emp_id from employees as employees_data@MichaelBroughton-我想没关系;dbtable条目表示它可以是from子句中的任何内容,也可以使用括号中的子查询来代替完整表,因此在这个基础上这是可以的。但不确定别名是否真的有用。但我以前从未使用过或见过它……如果它将该字符串传递给Oracle,我将从dual as中选择1得到相同的ORA-00933错误mydual@AlexPoole如果我不将别名用作employees_数据,spark会在线程main java.sql.SQLSyntaxErrorException:ORA-00903:无效表名中给出异常,我已经使用JdbcRDD测试了这个查询,因为JdbcRDD不适合数据源API@prakash-仅删除as时会发生什么情况?
options.put("dbtable", "(select emp_no, emp_id from employees) employees_data");
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.....));
DataFrame dataFrame = hContext.read().format("jdbc").options(oracle_options).load().select(String col1,String col2.....)).where(String expr);