2013-10-06 38 views
0

我在使用Pig脚本时遇到了我的Python UDF问题。我相信问题是,我假设我的输入增量是一种格式,它实际上不在,但我不知道如何解决它(Python n00b)。数据类型不匹配导致比较失败? Pig中的Python UDF

注意:Cloudera(cdh4.3)发行版Hadoop v.2.0.0,Pig v.0.11.0,Python 2.4.3。

import org.apache.pig.impl.logicalLayer.schema.SchemaUtil as SchemaUtil 

@outputSchema("adj:float") 
def cumRelFreqAdj(deltas): 

    # create bins of increment 0.01 
    a = [i*-0.01 for i in range(100)] 
    a = a[1:len(a)] 
    b = [i*0.01 for i in range(101)] 
    a.extend(b) 
    a.sort() 
    bins = a 

    # build cumulative relative frequency distribution 
    cumfreq = [0]*200 
    for delta in deltas: 
     for bin in range(len(bins)): 
      if delta <= bins[bin]: 
       cumfreq[bin] += 1 

    cumrelfreq = [float(cumfreq[i])/max(cumfreq) for i in range(len(cumfreq))] 

    crf = zip(bins, cumrelfreq) 

    for relfreq in crf[:]: 
     if relfreq[1] > 0.11: # 10%ile 
      adj = relfreq[0] + 0.05 
      break 

    return adj 

我需要将我的输入首先转换为列表吗?

+0

另请注意:使用numpy/scipy库不是我现在的选择。 –

回答

0

回答了我自己的问题。 Pig的输入是一包元组。在我的情况下,每个元组有一个元素,例如:{(-0.01),( - 0.03),(0.00001),( - 0.2383),(0.158)}。

因此,为了从另一个列表比较float型的元素,我需要插入类似:

delta = list(delta)[0] 
线16之间

& 17以上,拔出浮子键入的数据元素是元组的内容。然后第18行的比较将起作用。