UDF's in redshift : 可以在另一个中引用一个 udf

Posted

技术标签:

【中文标题】UDF\'s in redshift : 可以在另一个中引用一个 udf【英文标题】:UDF's in redshift : Possible to reference a udf within anotherUDF's in redshift : 可以在另一个中引用一个 udf 【发布时间】:2016-03-11 10:36:56 【问题描述】:

是否可以将 UDF 相互嵌套?

以下是用于在 A/B 测试中计算置信区间的代码 - 当然,我可以编写一个功能强大的多合一功能,但想知道实现这一目标的更好方法吗?

set search_path to public;
create function cumnormdist(x float)
  returns float
IMMUTABLE AS $$
  import math
  b1 = 0.319381530
  b2 = -0.356563782
  b3 = 1.781477937
  b4 = -1.821255978
  b5 = 1.330274429
  p = 0.2316419
  c = 0.39894228
  h=math.exp(-x * x / 2.0)
  if(x >= 0.0) :
    t = 1.0 / ( 1.0 + p * x )
    return (1.0 - c * h * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 ))
  else :
    t = 1.0 / ( 1.0 - p * x );
    return ( c * h * t *( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 ))
$$ language plpythonu;


set search_path to public;
create or replace function conversion(experience_total float,experience_conversions float)
  returns float
IMMUTABLE AS $$
  return experience_conversions*1.0/experience_total
$$ language plpythonu;


create or replace function zscore(total_c float,conversions_c float,total_t float,conversions_t float )
  returns float
IMMUTABLE AS $$
  import math
  z = conversion(total_t,conversions_t )-conversion(total_c,conversions_c) # Difference in means
  s =(conversion(total_t,conversions_t)*(1-conversion(total_t,conversions_t)))/total_t+(conversion(total_c,conversions_c)*(1-conversion(total_c,conversions_c)))/total_c
  return float(z)/float(math.sqrt(s))
$$ language plpythonu;

create or replace function confidence(total_c float,conversions_c float,total_t float,conversions_t float )
  returns float
IMMUTABLE AS $$
  import math
  return **(1-float(cumnormdist(zscore(total_c float,conversions_c float,total_t float,conversions_t float )),4))*100.00**
$$ language plpythonu;

个别调用工作正常,例如:select cumnormdist (-3.1641397476); 如果我将它们插入到函数定义中,它们不会,例如调用转换函数的 zscore。

ERROR:  NameError: global name 'zscore' is not defined. Please look at svl_udf_log for more information
DETAIL:  
  -----------------------------------------------
  error:  NameError: global name 'zscore' is not defined. Please look at svl_udf_log for more information
  code:      10000
  context:   UDF
  query:     0
  location:  udf_client.cpp:298
  process:   padbmaster [pid=3585]
  -----------------------------------------------

如果我可以将函数相互嵌套(而不是像上面那样最终嵌套 UDF),那将是一个合理的现状

最终目标:在 Tableau 中发布这些计算。

【问题讨论】:

【参考方案1】:

这是我解决它的方法。 UDF 不能交叉引用另一个 UDF 的内容,因此您可以创建自定义库,使用 CREATE 库将其上传到 AWS。

More here

【讨论】:

以上是关于UDF's in redshift : 可以在另一个中引用一个 udf的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Redshift Spectrum 中使用“IN”条件检查多个列?

SQL - 计算一个列值在另一列中的出现

如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?

单击一帧中的链接并在另一帧中显示 JSP

Redshift:“IN 子句”中的最大项目数?

pandas 判断某一列数据是不是在另一列中