Я пытаюсь добавить пару миллионов строк в таблицу в exasol. Предполагается, что один столбец имеет целочисленные значения (1 - xmio).Я не могу заставить мой скрипт на python работать параллельно и распределять нагрузку по разным узлам в кластере.Из-за этого процесс занимает несколько дней, но этого недостаточно.
Поскольку CSV-импорт параллелен в exasol, я создал CSV с 250-миллионными строками локально, заархивировал его и загрузил в таблицу, это былосамый быстрый подход, который занимает 7 минут (из-за моей скорости загрузки).
Другие подходы:
CREATE SCRIPT BIG1 (bound) AS
i = 0
while i < bound do
query([[insert into USER_XXXXX.BIG values (:n, null, null, null, null, null)]], {n=i})
i = i+1
end
/
EXECUTE SCRIPT BIG1(250000000);
Очень наивный подход, потому что вставка медленная, для ее завершения требуются годы
CREATE PYTHON SCALAR SCRIPT USER_XXXXX.BIG2 ("AMOUNT_TO_CREATE" DECIMAL(18,0))
EMITS (val DECIMAL(18,0), val BOOLEAN, val BOOLEAN, val BOOLEAN, val BOOLEAN, val BOOLEAN) AS
def generate_sql_for_import_spec(import_spec):
return "SELECT USER_XXXXX.BIG2("+import_spec.parameters["AMOUNT_TO_CREATE"]+")"
def run(ctx):
for i in range(1, ctx.AMOUNT_TO_CREATE + 1):
ctx.emit(i, None, None, None, None, None)
/
IMPORT INTO USER_XXXXX.BIG FROM SCRIPT USER_XXXXX.BIG2 WITH AMOUNT_TO_CREATE='250000000';
Работает лучше и полностью работает на сервере.Выполнение занимает около 33 минут
Я понимаю, что скрипт не может работать параллельно как есть.Было бы легко разделить его на 50-миллионные блоки и запустить на 5 узлах.К сожалению, я понятия не имею, как подключиться к другим узлам или назначить выполнение скрипта конкретным узлам в кластере.