我有一个使用 Apache Madlib 计算的非常大的数组,我想对该二维数组中的每个数组应用一个操作。
我找到了可以帮助我解除嵌套的代码这个相关答案。然而,在这个非常大的 2d 数组(150,000+ 1d float 数组)上,代码非常慢。尽管unnest()
运行只需要几秒钟,即使等待了几分钟代码也还没有完成。
当然,必须有一种更快的方法将大型二维数组解除嵌套到较小的一维数组中?如果该解决方案使用 Apache Madlib,则加分。我确实在文档中发现了一条埋藏在名为deconstruct_2d_array
但是,当我尝试在矩阵上调用该函数时,它失败并出现以下错误:
错误:函数“deconstruct_2d_array(双精度[])”:无效
类型转换。内部复合类型的元素多于
后端复合类型。
您在我的旧答案中找到的函数对于大数组来说不能很好地扩展。我从来没有想过你的数组大小,它可能应该是一个集合(一个表)。
尽管如此,这个 PL/pgSQL 函数可以替代参考答案。需要 Postgres 9.1 或更高版本。
CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
RETURNS SETOF ANYARRAY
LANGUAGE plpgsql IMMUTABLE STRICT AS
$func$
BEGIN
FOREACH a SLICE 1 IN ARRAY $1 LOOP
RETURN NEXT;
END LOOP;
END
$func$;
速度提高 40 倍在我对 Postgres 9.6 中的大型二维数组进行的测试中。
STRICT
以避免 NULL 输入的异常(如评论者:IamIC):
错误:FOREACH 表达式不能为空
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)