#oracle #hive #sqoop
#Oracle #улей #sqoop
Вопрос:
Я хочу создать схему таблицы в Hive, используя «sqoop create-hive-table» . Моей базой данных является Oracle Database 10g Enterprise Edition 10.2.0.4.0, я использую sqoop-1.2.0-cdh3u0 и hive-0.7.0-cdh3u0. Данные для последующей загрузки в таблицу Hive уже находятся в HDFS, и я бы предпочел, чтобы метаданные таблицы создавались автоматически sqoop amp; hive, а не создавались вручную и загружались данные впоследствии.
Вот команда, которую я выполняю :
$ sqoop create-hive-table --connect jdbc:oracle:thin:@//dbserver:1521/masterdb
--username myuser --table DBFUNC1.R1_EVOLUTION
--fields-terminated-by ',' -P
И я получаю следующую ошибку :
05.11.12 11:33:11 ИНФОРМАЦИОННЫЙ улей.HiveImport: загрузка загруженных данных в Hive
05.11.12 11:33:12 ИНФОРМАЦИОННЫЙ менеджер.OracleManager: для часового пояса установлено значение GMT 11/05/12
11:33:12 INFO manager.SqlManager: Выполнение инструкции SQL: ВЫБЕРИТЕ t.* ИЗ BFUNC1.R1_EVOLUTION t, ГДЕ 1=0
05.11.12 11:33:14 ИНФОРМАЦИОННЫЙ куст.HiveImport: история улья file=/tmp/edjatsay/hive_job_log_edjatsay_201105121133_1466429457.txt
05.11.12 11:33:14 ИНФОРМАЦИОННЫЙ куст.HiveImport: СБОЙ: Ошибка синтаксического анализа: строка 1: 58 не соответствует вводимому ‘)’ ожидаемому идентификатору в спецификации столбца
05.11.12 11:33:14 ИНФОРМАЦИОННЫЙ куст.HiveImport:
05.11.12 11:33:14 Инструмент ДЛЯ УСТРАНЕНИЯ ОШИБОК.CreateHiveTableTool: Возникло исключение IOException при выполнении задания создания таблицы: java.io.Исключение IOException: Куст завершен со статусом 11
Вот схема таблицы в БД :
SQL> describe BFUNC1.R1_EVOLUTION;
OWNER_ID NOT NULL NUMBER(38)
AI_CODE NOT NULL CHAR(3)
TA_NUMBER NOT NULL NUMBER(38)
RULE NOT NULL CHAR(4)
F_CLASS NOT NULL CHAR(8)
EVOLUTION_ID NOT NULL NUMBER(38)
CREATION_MODIFID NUMBER(38)
DISC_MODIFID NUMBER(38)
CREATION_DATETIME CHAR(19)
ENDED_DATETIME CHAR(19)
EVOLUTION_STATE CHAR(1)
Заранее спасибо за вашу помощь.
Ответ №1:
Я, наконец, решил эту проблему, импортировав одну строку моей таблицы с помощью sqoop с опцией «—hive-import». Это команда, которую я использовал :
$ sqoop import --connect jdbc:oracle:thin:@//dbserver:1521/masterdb --username myuser --table DBFUNC1.R1_EVOLUTION --where 'rownum=1' --verbose -P
Затем я просто удалил единственную строку, импортированную ранее, и вручную загрузил данные, которые у меня уже были в HDFS.
Целью этого было позволить Hive угадать и создать метаданные автоматически. Я хочу иметь возможность выполнять весь процесс в общем сценарии.
Ответ №2:
Ниже приведен запрос импорта sqoop, который я использую в своем проекте:
oracle_connection.txt будет иметь информацию о подключении.
sqoop --options-file oracle_connection.txt
--table $DATABASE.$TABLENAME
-m $NUMMAPPERS
--where "$CONDITION"
--hive-import
--map-column-hive "$COLLIST"
--create-hive-table
--hive-drop-import-delims
--split-by $SPLITBYCOLUMN
--hive-table $HIVEDATABASE.$TABLENAME
--bindir sqoop_hive_rxhome/bindir/
--outdir sqoop_hive_rxhome/outdir