0

我正在尝试向 exasol 中的表中添加几百万行,其中一列应该具有递增的整数值(1 - xmio)。我无法让我的 python 脚本并行运行并将负载分配到集群中的不同节点。因此,该过程需要数天才能完成,这还不够。

由于 CSV-Import 在 exasol 中是并行的,我在本地创建了一个 250mio 行的 CSV,将其压缩并上传到表中,这是迄今为止最快的方法,需要 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 分钟

我了解,该脚本不能按原样并行运行。很容易将其划分为 50Mio 块并在 5 个节点上运行。不幸的是,我不知道如何连接到其他节点或将脚本执行分配给集群中的特定节点。

4

1 回答 1

1

您应该在多个节点上运行脚本的多个实例。实现并行性的最简单方法是创建一个代理表,其中包含与您希望运行的并行进程数一样多的行。

假设我们要运行 5 个并行进程。

CREATE TABLE script_parallel
(
    proc_id DECIMAL(18,0)
);

INSERT INTO script_parallel VALUES ((1),(2),(3),(4),(5));

您现在可以使用此表运行多个脚本实例:

SELECT my_script(proc_id, 5, 250000000)
FROM script_parallel
GROUP BY proc_id

在每个脚本实例中,每隔(第 N 个值 + proc_id)发射一次,最大值为 250000000。每个脚本实例都应生成较小的最终结果子集。Exasol 将为您合并所有实例的结果。

将 LUA 脚本语言用于此类脚本是一个好主意。性能将提高 100 倍。

于 2019-05-09T14:25:17.247 回答