2013-10-06 2 views
0

돼지 스크립트에서 사용하기 위해 Python UDF에 문제가 있습니다. 나는 문제가 내가 내 입력을한다고 생각한다. 델타은 실제 포맷이 아니지만 (파이썬 n00b) 그것을 고치는 방법을 모르겠다.데이터 형식이 일치하지 않아 비교가 실패 했습니까? Python의 UDF

참고 : Hadoop v.2.0.0의 Cloudera (cdh4.3) 배포판에서 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)}와 같은 요소가 하나 있습니다.

그래서 다른 목록에서 플로트 타입의 요소에 쓰레기통을 비교하기 위해, 내가 좋아하는 뭔가를 삽입해야합니다 : 선 (16) 사이

delta = list(delta)[0] 

위 & (17)는 float-을 당겨 튜플의 내용 인 유형이 지정된 데이터 요소 그런 다음 18 행의 비교가 작동합니다.

관련 문제