我正在尝试向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个节点上运行将非常容易。不幸的是,我不知道如何连接到其他节点,或者如何将脚本执行分配给集群中的特定节点。
发布于 2019-05-09 22:25:17
您应该在多个节点上运行脚本的多个实例。实现并行性的最简单方法是创建一个代理表,其中包含的行数与您希望运行的并行进程数相同。
假设我们想要运行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倍。
https://stackoverflow.com/questions/56018436
复制相似问题