【问题标题】:Use PostgreSQL plpython3u function to return a table使用 PostgreSQL plpython3u 函数返回一个表
【发布时间】:2019-06-19 01:29:07
【问题描述】:

我想退货。 该函数获取一个数组(查询是'select function_name(array_agg(column_name)) from table_name')

我在下面编码:

create type pddesctype as(
    count float,
    mean float,
    std float,
    min float
);

create function pddesc(x numeric[])
returns pddesctype
as $$
    import pandas as pd
    data=pd.Series(x)
    
    count=data.describe()[0]
    mean=data.describe()[1]
    std=data.describe()[2]
    min=data.describe()[3]
    
    return count, mean, std, min

$$ language plpython3u;

此代码仅导致一列上的数组。 (浮动,浮动,浮动...)

我试过了

create function pddesc(x numeric[])
returns table(count float, mean float, std float, min float)
as $$
    import pandas as pd
    data=pd.Series(x)
    
    count=data.describe()[0]
    mean=data.describe()[1]
    std=data.describe()[2]
    min=data.describe()[3]
    
    return count, mean, std, min

$$ language plpython3u;

但是有一个错误:

ERROR:  key "count" not found in mapping
HINT:  To return null in a column, add the value None to the mapping with the key named after the column.
CONTEXT:  while creating return value.

我想在不预先创建类型的情况下以列(如表格)显示结果。

如何更改 RETURN / RETURNS 语法?

【问题讨论】:

  • 如果你想返回一个表,那么使用returns table (...)
  • 我应该创建一个返回值更新的表吗?
  • 返回表格的函数必须像表格一样使用select * from pddesc(...)
  • 我需要从另一个表中获取数据,所以我尝试了select * from (select pddesc(array_agg(column_name)) from table_name) as result。但是,我在一列上得到数组数据。你知道另一种获取餐桌的方法吗?
  • 我处理这个问题。我在 python 代码中使用了 plpy 查询。谢谢

标签: postgresql plpython postgres-plpython


【解决方案1】:

以下是我尝试获取包含四列的一行表格作为输出的步骤。最后一步有解决方案,第一步是重现错误的另一种方法。

检查 np.array

create or replace function pddesc(x numeric[])
returns table(count float, mean float, std float, min float)
as $$
    import pandas as pd
    import numpy as np
    data=pd.Series(x)

    count=data.describe()[0]
    mean=data.describe()[1]
    std=data.describe()[2]
    min=data.describe()[3]
    
    ## print an INFO of the output:
    plpy.info(np.array([count, mean, std, min]))

    return np.array([count, mean, std, min])

$$ language plpython3u;

测试失败(重现问题的错误):

postgres=# SELECT * FROM pddesc(ARRAY[1,2,3]);
INFO:  [3 3 Decimal('1') 1]
ERROR:  key "count" not found in mapping
HINT:  To return null in a column, add the value None to the mapping with the key named after the column.
CONTEXT:  while creating return value
PL/Python function "pddesc"

工作解决方案:np.array([...]).reshape(1,-1)

您需要重新调整数组的形状,使其具有您想要的尺寸。在这种情况下,它是暗淡的(1 行 x 4 列),.reshape(1,-1) 表示 1 行和 -1(= 任何需要)列

create or replace function pddesc(x numeric[])
returns table(count float, mean float, std float, min float)
as $$
    import pandas as pd
    import numpy as np
    data=pd.Series(x)

    count=data.describe()[0]
    mean=data.describe()[1]
    std=data.describe()[2]
    min=data.describe()[3]

    ## print an INFO of the output:
    plpy.info(np.array([count, mean, std, min]).reshape(1,-1))

    return np.array([count, mean, std, min]).reshape(1,-1)
    ## or with the same result:
    # return np.hstack((count, mean, std, min)).reshape(1,-1)

$$ language plpython3u;

测试:

postgres=# SELECT * FROM pddesc(ARRAY[1,2,3]);
INFO:  [[3 3 Decimal('1') 1]]
 count | mean | std | min
-------+------+-----+-----
     3 |    3 |   1 |   1
(1 row)

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 2022-07-07
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多