我在用Pig做作业。我已经计算了他需要的所有值,但是我需要以特定的格式输出它们,所以我用python编写了一个udf。它被传递了一袋元组 {(id: int,tfidf: double)}
(pig的文档并没有具体说明python的用法,但是从示例中我猜它是一个元组的iterable)并且它返回一个 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异常的提示。
如果我不把数据传给我的自定义项并把它作为一个包存储,一切都会正常。
这个代码有什么问题?
2条答案
按热度按时间7nbnzgx91#
问题出在
format
. 用旧式替换%
格式化允许脚本完成。z9ju0rcb2#
因为这是家庭作业,我不会给你完整的答案,但我建议你仔细看看你的outputschema和审查这个线程。