我在使用Pig脚本时遇到Python UDF问题。我认为问题在于我假设我的输入 deltas 采用的格式实际上并不存在,但我不确定如何解决它(Python n00b)。
注意:在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 :(得分:0)
回答了我自己的问题。 Pig的输入是一包元组。在我的例子中,每个元组都有一个元素,例如:{( - 0.01),( - 0.03),(0.00001),( - 0.2383),(0.158)}。
因此,为了将它与另一个列表 bins 中的float类型元素进行比较,我需要插入类似的内容:
delta = list(delta)[0]
第16行和第16行之间的在上面的图17中,拉出作为元组内容的浮点型数据元素。然后第18行的比较将起作用。