在 Redshift 中使用 python UDF 中的表
Posted
技术标签:
【中文标题】在 Redshift 中使用 python UDF 中的表【英文标题】:Using a table in python UDF in Redshift 【发布时间】:2021-07-01 02:48:26 【问题描述】:我需要在 redshift 中创建一个 python UDF(用户定义函数),它将在其他一些过程中调用。此 python UDF 采用两个日期值并比较给定开始日期和结束日期内的这些日期,并检查这些中间日期在某些 list
中的出现。
这个列表需要从另一个表的列中收集它的值。现在的问题是,python UDF 是用plpythonplu
语言定义的,它们不识别任何 sql。我应该怎么做才能使这个列表脱离表格的列?
这是我的功能:
create or replace function test_tmp (ending_date date, starting_date date)
returns integer
stable
as $$
def get_working_days(ending_date , starting_date ):
days=0
if start_date is not None and end_date is not None:
for n in range(int ((ending_date - starting_date).days)):
btw_date= (start_date + timedelta(n)).strftime('%Y-%m-%d')
if btw_date in date_list:
days=days+1
return days
return 0
return get_working_days(ending_date,starting_date)
$$ language plpythonu;
现在,我需要创建这个 date_list,如下所示:
date_list = [str(each["WORK_DATE"]) for each in (select WORK_DATE from public.date_list_table).collect()]
但是,在函数中使用这一行显然会出错,因为select WORK_DATE from public.date_list_table
是 SQL。
以下是表public.date_list_table
的结构:
CREATE TABLE public.date_list
(
work_date date ENCODE az64
)
DISTSTYLE EVEN;
此表的一些示例值(实际上此表仅存储全年的工作日值):
insert into date_list_table values ('2021-07-01'),('2021-06-30'),('2021-06-29');
【问题讨论】:
【参考方案1】:Amazon Redshift Scalar SQL UDF - Amazon Redshift 无法访问任何表。它需要通过将所有必要的信息传递给函数来实现自包含。或者,您可以将日期信息存储在函数内部,这样它就不需要访问表(并非不合理,因为它只需要在工作日保持公共假期等例外情况)。
您的用例似乎是计算两个日期之间的工作日数。传统上解决此问题的一种方法是创建一个表日历,其中每天一行,列提供以下信息:
工作日(布尔值) 周末(布尔值) 公共假期(布尔) 月 季度 一年中的哪一天 等然后您可以通过 JOIN 或查询表来识别所需的信息,例如:
SELECT COUNT(*) FROM calendar WHERE work_day AND date BETWEEN start_date AND end_date
【讨论】:
非常感谢@John Rotenstein。你的建议帮助了我。通过在线参考并不清楚是否可以在 python UDF 中使用表。再次感谢!!以上是关于在 Redshift 中使用 python UDF 中的表的主要内容,如果未能解决你的问题,请参考以下文章
Redshift - 使用 Python UDF 从 JSON 中提取根密钥
您可以从 Redshift 中的 python UDF 返回多个值吗?
Psycopg2 是不是允许使用 Python 在 redshift 上运行 udf create 查询?