在 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 查询?

使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF

在 Redshift 中创建 python UDF 时出错

Redshift Python UDF 自行运行,但在部分使用 count 或作为另一个查询的一部分时会引发错误