我有一个非常大的数组,我用 Apache Madlib 计算了它,我想对该二维数组中的每个数组应用一个操作。
我找到了可以帮助我从 this related answer 中取消嵌套的代码.然而,在这个非常大的二维数组(150,000+ 1d float 组)上,代码速度非常慢。虽然 unnest()
只需要几秒钟就可以运行,但即使等待了几分钟,代码也没有完成。
当然,一定有更快的方法将大型二维数组拆嵌为较小的一维数组?如果该解决方案使用 Apache Madlib,则加分。我确实在名为 deconstruct_2d_array
的文档中找到了一条线索,但是,当我尝试在矩阵上调用该函数时,它失败并出现以下错误:
ERROR: Function "deconstruct_2d_array(double precision[])": Invalid type conversion. Internal composite type has more elements than backend composite type.
最佳答案
您在我的旧答案中找到的函数不适用于大数组。我从来没有想过像你这样大的数组,它可能应该是一个集合(一个表)。
尽管如此,这个 PL/pgSQL 函数可以替代 referenced answer 中的函数.需要 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 输入异常(如 commented by IamIC ):
ERROR: FOREACH expression must not be null
关于sql - 如何在 PostgreSQL 中快速将二维数组嵌套到一维数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402399/