用于Apache Pig的Python UDF失败

时间:2013-12-12 14:11:14

标签: python hadoop apache-pig jython user-defined-functions

我正在使用Pig做作业。我已经计算了所有他需要的值,但是我需要以特定的格式输出它们,所以我用Python编写了一个UDF。 它传递了一包元组{(id: int,tfidf: double)}(猪的文档没有详细说明这对Python的看法,但从示例中我猜它是一个可迭代的元组)并返回chararray。实际代码是:

@outputSchema('doclist:chararray')
def format_list(docs):
  outs = []
  for docid, tfidf in docs:
    outs.append('{0}:{1}'.format(docid, tfidf))
  return '\t'.join(outs)

调用
tfidf = FOREACH (GROUP tfsWithNDocs BY token) {
    idf = LOG((double)totaldocs.total / (double)ndocs);
    ranked = FOREACH tfsWithNDocs GENERATE id, tf * idf AS tfidf;
    ordered = ORDER ranked BY tfidf DESC;
    relevant = LIMIT ordered 20;
    GENERATE group AS token, funs.format_list(relevant) AS relevant;
};

当我运行脚本时,它失败了:

org.apache.pig.backend.executionengine.ExecException: ERROR 0: Error executing function
    at org.apache.pig.scripting.jython.JythonFunction.exec(JythonFunction.java:120)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc.getNext(POUserFunc.java:337)
    ... (several hadoop calls)

没有关于实际Python异常的提示。

如果我没有将数据传递给我的UDF并将其存储为包,那么一切正常。

这段代码有什么问题?

2 个答案:

答案 0 :(得分:1)

问题出在format。用旧式%格式替换它可以让脚本完成。

答案 1 :(得分:0)

由于这是作业,我不会给你完整的答案,但我建议你仔细查看outputSchema并查看this thread