redshift 中的 UDF:可以在另一个中引用一个 udf
UDF's in redshift : Possible to reference a udf within another
是否可以将 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 中发布这些计算。
我是这样解决的。 UDF 不能交叉引用另一个 UDF 的内容,因此您可以创建自定义库,使用 CREATE 库将其上传到 AWS。
是否可以将 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 中发布这些计算。
我是这样解决的。 UDF 不能交叉引用另一个 UDF 的内容,因此您可以创建自定义库,使用 CREATE 库将其上传到 AWS。