plpython 程序中的 Greenplum pandas 数据框集成(来自数据库内部)

Posted

技术标签:

【中文标题】plpython 程序中的 Greenplum pandas 数据框集成(来自数据库内部)【英文标题】:Greenplum pandas dataframe integration in plpython procedure (from INSIDE the database) 【发布时间】:2018-07-12 12:13:01 【问题描述】:

是否可以在 greenplum 数据库中使用 pandas,如果可以,如何使用? 我在greenplum里面。我正在创建一个函数:

CREATE OR REPLACE FUNCTION myfunction() RETURNS
text AS $$ 
...
python code
...
rv = plpy.execute("SELECT * FROM mytable")
...

$$ LANGUAGE plpythonu;
SELECT public.myfunction()

命令rv = plpy.execute("SELECT * FROM mytable") 生成一个PlyResult 类型的对象。此时,我想用 python pandas 分析 rv 中的数据,例如。如何将 rv 转换为数据框? 谢谢!

【问题讨论】:

【参考方案1】:

这是我的一个例子:

drop function if exists describe_yelp();
create or replace function describe_yelp(
OUT stats text,
OUT stars numeric,
OUT cool numeric,
OUT useful numeric,
OUT funny numeric,
OUT txt_length numeric)
returns setof record
as $$
import pandas as pd
import numpy as np
import nltk
from nltk.corpus import stopwords
yelp=pd.DataFrame.from_records(plpy.execute('select * from yelp'))[['stars','cool','useful','funny','text']]
yelp['txt_length'] = yelp['text'].apply(len)
return yelp.describe().to_records()      
$$
language plpythonu;

我的博客里还有更多Greenplum - Pandas - Numpy - 等集成的例子: https://dwhsys.com/2018/05/06/data-mining-in-mpp-database/

【讨论】:

【参考方案2】:

也许你可以试试pd.DataFrame(rv[0:])。 下面是 Postgres 中的一个测试

postgres=# do $$
postgres$# import numpy as np
postgres$# import pandas as pd
postgres$# 
postgres$# iris = plpy.execute("SELECT * FROM iris LIMIT 3")
postgres$# plpy.notice(type(iris[0:]))
postgres$# iris = pd.DataFrame(iris[0:])
postgres$# 
postgres$# X = iris[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
postgres$# plpy.notice(type(X))
postgres$# plpy.notice(X)
postgres$# 
postgres$# $$ language plpython3u;
NOTICE:  <class 'list'>
NOTICE:  <class 'numpy.ndarray'>
NOTICE:  [[Decimal('5.10') Decimal('3.50') Decimal('1.40') Decimal('0.20')]
 [Decimal('4.90') Decimal('3.00') Decimal('1.40') Decimal('0.20')]
 [Decimal('4.70') Decimal('3.20') Decimal('1.30') Decimal('0.20')]]
DO
postgres=# 

【讨论】:

以上是关于plpython 程序中的 Greenplum pandas 数据框集成(来自数据库内部)的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum 数据库:启用 PL/Python 模块

如何在 Postgres 中使用 Plpython3 返回结果集

在 plpython 中处理反斜杠

greenplum 中的 gpload 实用程序

Greenplum 4.3:填充缺失值

YMatrix + PLPython替代Spark实现车联网算法