У меня есть секционированная внешняя таблица Hive, которую я должен перезаписать некоторыми записями. Есть много дат, которые нам нужно перезагрузить, и запросы немного тяжелые. Мы хотим знать, возможно ли одновременно загружать два или более разных раздела одновременно? Например, 3 (или более) процессов, работающих параллельно, например:
Процесс1
insert overwrite table_prod partition (data_date)
select * from table_old where data_date=20221110;
Процесс2
insert overwrite table_prod partition (data_date)
select * from table_old where data_date=20221111;
Процесс3
insert overwrite table_prod partition (data_date)
select * from table_old where data_date=20221112;
У нас он был в цикле, но он выполнялся последовательно, и мы хотели сначала проверить, возможно ли его параллельное выполнение, потому что мы не были уверены, создаст ли хауоп проблемы из-за параллелизма перезаписей в одной и той же таблице, даже если они были разные перегородки. У нас уже было что-то, запускающее процессы параллельно из unix, тут оставляю скрипт.
cores=10 для fecha в $(hive --showHeader=false --outputformat=tsv2 -e 'показать разделы sandbox_datascientist.am_cdr_datasets;' | cut -d" = " -f2); do hive --hivevar FECHA=${fecha} -f "${PATH_SQL}/insert_cdr_datasets.sql" 1>ins.err 2>ins.out & while :; do background=( $(jobs -p)) if (( ${#background[@]} < $cores )); затем прервать сон 1 сделано сделано
Короткий ответ: да, вы можете.
Реальный вопрос в том, как - потому что вам нужно учитывать большой объем данных.
Вариант 1 - да, вы можете использовать сценарий оболочки или какой-либо инструмент планировщика. Но используемый вами запрос будет медленным. вы можете использовать статическое разбиение, которое намного быстрее.
insert overwrite table_prod partition (data_date=20221110) -- pls note i mentioned partition value.
select
col1, col2... -- exclude data_date column from select list
from table_old where data_date=20221110;
Вариант 2. Вы также можете использовать динамическую схему разделов для загрузки всех разделов одновременно. Это интенсивная операция, но вам не нужно создавать какой-либо сценарий оболочки или любой другой процесс.
insert overwrite table_prod partition (data_date)
select * from table_old
Эй, большое спасибо, Кушик Рой. Используя статический раздел, с 20 минут, которые длились в день, он превратился почти в 2 минуты в день, и это голазо. Мы только что протестировали целый месяц, работающий 7 дней параллельно, и он летает!!!
если это golazo
, то надеюсь я вам помог :)...
Почему вы не можете написать цикл сценария оболочки для выполнения этих запросов в параллельных процессах?