我正在使用嵌入式R的Monetdb数据库。现在,我想处理列中的数据,这基本上减少了数值。
现在的问题是,是否可以创建一个R函数,该函数采用带有n
值的输入列,并返回包含m
(m <> n)
列的列。
我尝试了但是函数的输出有些恼人:
-- create data
CREATE FUNCTION generate(n INTEGER) RETURNS TABLE(data DOUBLE) LANGUAGE R{
data.frame(rnorm(n))
};
-- reduce data
CREATE FUNCTION reduce(data REAL) returns DOUBLE LANGUAGE R{
data[1:(length(data)-1)]
};
-- actually reduce generated data
select reduce(data) from generate(3);
这输出以下内容:
sql>select reduce(data) from generate(3);
+--------------------------+
| L4 |
+==========================+
| -0.6561001539230347 |
| 1.0922646522521973 |
+--------------------------+
2 tuples (47.601ms)
当我在输出中添加另一列时,有趣的想法发生了:
sql>select 1,reduce(data) from generate(3);
+------+--------------------------+
| L4 | L6 |
+======+==========================+
| 1 | -1.2222824096679688 |
| 1 | 2.696558952331543 |
+------+--------------------------+
3 tuples (5.455ms)
monetdb 认为提供更改的元组数。代码有什么问题,或者减少输出列的长度是错误的吗?
这只是真实问题的简化示例。将结果插入另一个表时会出现实际问题。
CREATE TABLE test(i INTEGER, r real);
insert into test select 1,reduce(data) from generate(3);
2 affected rows (4.404ms)
给出
select * from test;
GDK reported error.
BATproject: does not match always
问题的原因是什么?我认为它与上述问题有某种关联。