我正在使用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并将其存储为包,那么一切正常。
这段代码有什么问题?
答案 0 :(得分:1)
问题出在format
。用旧式%
格式替换它可以让脚本完成。
答案 1 :(得分:0)
由于这是作业,我不会给你完整的答案,但我建议你仔细查看outputSchema并查看this thread。