2016-03-11 41 views
0

是否可以將UDF嵌套在一起?UDF的紅移:可能引用另一個UDF

以下是用於計算A/B測試中置信區間的代碼 - Ofcourse,我可以編寫一個功能齊全的巨大函數,但想知道實現此目標的更好方法嗎?

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