0

Pig スクリプトで使用する Python UDF に問題があります。問題は、入力デルタが実際には存在しない形式であると想定したことだと思いますが、それを修正する方法がわかりません(Python n00b)。

注: Hadoop v.2.0.0、Pig v.0.11.0、Python 2.4.3 の Cloudera (cdh4.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

最初に入力をリストに変換する必要がありますか?

4

1 に答える 1

0

私自身の質問に答えました。Pig からの入力は、タプルのバッグです。私の場合、各タプルには 1 つの要素があります。たとえば、{(-0.01)、(-0.03)、(0.00001)、(-0.2383)、(0.158)} です。

したがって、それを別のリストbinsの float 型の要素と比較するには、次のようなものを挿入する必要があります。

delta = list(delta)[0]

上記の 16 行目と 17 行目の間で、タプルの内容である float 型のデータ要素を取り出します。次に、18 行目の比較が機能します。

于 2013-10-06T17:56:18.413 に答える