(Будь добр, это мой первый вопрос, и я заранее провел обширные исследования здесь и в сети. Вопрос Oracle ROWID для столбца Sqoop Split-By на самом деле не решил эту проблему, так как оригинальный человекпросил прибегнуть к использованию другого столбца)
Я использую sqoop для копирования данных из БД Oracle 11.К сожалению, некоторые таблицы не имеют индекса, первичного ключа, только разделы (дата).Эти таблицы очень большие, сотни миллионов, если не миллиарды строк.до сих пор я решил получить доступ к данным в источнике, явно указав разделы.Это работает хорошо и ускоряет процесс.
Мне нужно выполнить разбиение по данным, находящимся в каждой таблице, чтобы избежать слишком большого числа ветвей if в моем скрипте bash.(мы говорим здесь более 200 таблиц)
Я заметил, что разделение на 8 задач приводит к очень неравномерному распределению рабочей нагрузки между задачами.Я решил использовать Oracle ROWID для определения разделения.
Чтобы сделать это, я должен определить пограничный запрос.В стандартном запросе 'select * from xyz'
идентификатор строки не является частью набора результатов.следовательно, Sqoop не может определять определение пограничного запроса из --query.
Теперь, когда я запускаю это, я получаю ошибку
ERROR tool.ImportTool: Encountered IOException running import job:
java.io.IOException: Sqoop does not have the splitter for the given SQL
data type. Please use either different split column (argument --split-by)
or lower the number of mappers to 1. Unknown SQL data type: -8
samples ROWID:
AAJXFWAKPAAOqqKAAA
AAJXFWAKPAAOqqKAA +
AAJXFWAKPAAOqqKAA /
статично и уникально, как только оно создано для любой строки.
этот забавный тип данных во что-то еще в моем пограничном запросе
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect
jdbc:oracle:thin:@127.0.0.1:port:mydb --username $USER --P --m 8
--split-by ROWID --boundary-query "select cast(min(ROWID) as varchar(18)), cast
( max(ROWID)as varchar(18)) from table where laufbzdt >
TO_DATE('2019-02-27', 'YYYY-MM-DD')" --query "select * from table
where laufbzdt > TO_DATE('2019-02-27', 'YYYY-MM-DD') and \$CONDITIONS "
--null-string '\\N'
--null-non-string '\\N'
Но затем я получаю некрасивые ROWID, которые отклоняются Oracle:
select * from table where laufbzdt > TO_DATE('2019-02-27', 'YYYY-MM-DD')
and ( ROWID >= 'AAJX6oAG聕聁AE聉N:' ) AND ( ROWID < 'AAJX6oAH⁖⁁AD䁔䀷' ) ,
Error Msg = ORA-01410: invalid ROWID
как я могу решить это правильно?
Я - LINUX-Embryo и до сих пор мучительно пережевывал Темы написания сценариев bash-shell и Sqooping, но я хотел бы лучше использовать равномерно распределенную рабочую нагрузку задачи mapper - это уменьшило бы sqoop-Я думаю, время в два раза сэкономит от 5 до 8 часов.
TIA!wahlium