ORA-00933: команда SQL неправильно завершила ошибку при запросе базы данных Oracle с помощью Spark

Я пытался загрузить данные из базы данных Oracle с помощью API источника данных Spark.

Поскольку мне нужно загружать данные по запросу, я использовал запрос ниже, который я собрал из нескольких примеров в Интернете:

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 не завершена должным образом

Я сомневаюсь, что мы не можем указать «as employee_data» для запроса Oracle, так что я делаю не так?


person prakash    schedule 01.03.2016    source источник
comment
В вашем коде есть ссылки вроде MYSQL_DRIVER; вы действительно подключаетесь к базе данных Oracle или MySQL?   -  person Alex Poole    schedule 01.03.2016
comment
извините, я забыл изменить имя переменной ... значения внутри переменной используют драйверы Oracle private static final String MYSQL_DRIVER = oracle.jdbc.OracleDriver; частная статическая финальная строка MYSQL_USERNAME = qauser; частная статическая финальная строка MYSQL_PWD = qauser; закрытая статическая конечная строка MYSQL_CONNECTION_URL = jdbc: oracle: thin: @ //;   -  person prakash    schedule 01.03.2016


Ответы (2)


Я сомневаюсь, что мы не можем указать "as employee_data" для запроса Oracle.

Вы можете в этом сомневаться, но вы не можете использовать AS в качестве псевдонима таблицы в Oracle. Вы можете использовать псевдонимы столбцов, если это необязательно, но не разрешено для псевдонимов таблиц. Вы можете увидеть это на синтаксической диаграмме.

Предполагая, что Spark не возражает против самого псевдонима, вы можете просто удалить AS:

options.put("dbtable", "(select emp_no, emp_id from employees) employees_data");
person Alex Poole    schedule 01.03.2016
comment
Хуже того, он пытается связать весь набор результатов с этими скобками! (выберите emp_no, emp_id из сотрудников) в качестве employee_data - person Michael Broughton; 01.03.2016
comment
@MichaelBroughton - Я думаю, что все в порядке, из документы Spark; запись dbtable говорит, что это может быть все, что может быть в предложении from, и вместо полной таблицы вы также можете использовать подзапрос в круглых скобках, так что на этом основании это будет нормально. Не уверен, что псевдоним действительно полезен. Я никогда не использовал это (или видел это раньше ...) - person Alex Poole; 01.03.2016
comment
Если он передает эту строку в Oracle, я получаю ту же ошибку ORA-00933 с (выберите 1 из двойных) как mydual - person Michael Broughton; 01.03.2016
comment
Да, но вы также можете получить это от select * from (select 1 from dual) as mydual, что, как я думаю, делает Spark - используя все, что находится в dbtable в качестве from. Но это только из-за сканирования этого документа, поэтому может ошибаться * 8-) - person Alex Poole; 01.03.2016
comment
@AlexPoole, если я не использую псевдоним в качестве employee_data, искра выдает мне исключение в основном потоке java.sql.SQLSyntaxErrorException: ORA-00903: недопустимое имя таблицы, я протестировал этот запрос с помощью JdbcRDD, работает нормально, поскольку JDBCRDD не рекомендуется против API источников данных - person prakash; 01.03.2016
comment
Не имея доступа к Spark - выйду из обсуждения. Возможно, удаление ключевого слова AS сработает. Я надеюсь на это ради ОП! - person Michael Broughton; 01.03.2016
comment
@prakash - у вас может быть псевдоним, но не ключевое слово AS. Но похоже, что в этом нет необходимости. Вы уверены, что в схеме qauser есть employees таблица? Или, по крайней мере, доступ к одному без его квалификации, например как from hr.employees? - person Alex Poole; 01.03.2016
comment
@AlexPoole, да, тестировал тот же запрос с тем же именем пользователя и конфигурацией в JdbcRDD API, отлично работает. - person prakash; 01.03.2016
comment
@prakash - что произойдет, если вы просто удалите as? - person Alex Poole; 01.03.2016
comment
@AlexPoole Он отлично работал, удалив AS, options.put (dbtable, (выберите emp_no, emp_id из сотрудников) employee_data); Спасибо всем за помощь - person prakash; 01.03.2016
comment
@prakash, пожалуйста, примите ответ, потому что он помог вам и как минимум двум другим людям. - person SergiyKolesnikov; 08.08.2018

Попробуйте это ...

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);
person Manjunatha H C    schedule 19.05.2016