0

我的 Python UDF 代码:

#commaFormat- format a number with commas, 12345-> 12,345
 @outputSchema("numformat:chararray")
 def commaFormat(num):
   return '{:,}'.format(num)

我的猪脚本:

DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage;
A = LOAD '/result.csv' using CSVExcelStorage() As (id:int,lastvisitedtime:chararray,title:chararray,typedcount:int,URL:chararray,visitcount:int,bytes:int);
B = limit A 15;
REGISTER '/data/pyudf/test.py' USING streaming_python AS myudfs;
C = FOREACH B generate myudfs.commaFormat($1);

猪堆栈跟踪:

--------------- 错误 1002:无法存储别名 C

org.apache.pig.impl.logicalLayer.FrontendException:错误 1066:无法在 org.apache.pig.PigServer.openIterator(PigServer.java:1019) 在 org.apache.pig.tools.grunt 打开别名 C 的迭代器。 GruntParser.processDump(GruntParser.java:747) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:376) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser. java:231) 在 org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:81) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:206) 在 org.apache .pig.Main.run(Main.java:630) 在 org.apache.pig.Main.main(Main.java:176) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) 在 sun.reflect。DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.util.RunJar.run(RunJar.java:221) at org.apache .hadoop.util.RunJar.main(RunJar.java:136) 原因:org.apache.pig.PigException: ERROR 1002: Unable to store alias C at org.apache.pig.PigServer.storeEx(PigServer.java:1122 ) at org.apache.pig.PigServer.store(PigServer.java:1081) at org.apache.pig.PigServer.openIterator(PigServer.java:994) ... 13 更多原因:org.apache.pig.backend .executionengine.ExecException:错误 0:执行时出现异常(名称:C:存储(hdfs://localhost:54310/tmp/temp1063554930/tmp-651585063:org.apache.pig.impl.io.InterStorage)-scope-16运算符键:scope-16):org.apache.pig.impl.streaming.StreamingUDFException:LINE:KeyError:'concatMult4'

在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput(PhysicalOperator.java:314) 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POStore.getNextTuple(POStore.java: 159) 在 org.apache.pig.backend.hadoop.executionengine.fetch.FetchLauncher.runPipeline(FetchLauncher.java:157) 在 org.apache.pig.backend.hadoop.executionengine.fetch.FetchLauncher.launchPig(FetchLauncher.java: 81) 在 org.apache.pig.PigServer.launchPlan(PigServer.java:1474) 在 org.apache.pig.PigServer 的 org.apache.pig.backend.hadoop.executionengine.HExecutionEngine.launchPig(HExecutionEngine.java:306) .executeCompiledLogicalPlan(PigServer.java:1459) at org.apache.pig.PigServer.storeEx(PigServer.java:1118) ... 15 更多原因:org.apache.pig.impl.streaming。StreamingUDFException: LINE : KeyError: 'concatMult4'

在 org.apache.pig.impl.builtin.StreamingUDF$ProcessErrorThread.run(StreamingUDF.java:503)

4

2 回答 2

0

Pig 不处理带有依赖模块的 Python UDF。因此,您需要将它们包装在 JAR 中并将该文件注册为 Pig 脚本的一部分。

REGISTER '/data/pyudf/test.py' USING jython AS myudfs;

Python UDF 解释

于 2017-01-17T11:26:18.383 回答
0

首先,您的定义语句中缺少 ()。

REGISTER /path/piggybank.jar;
DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage();

您可能正在使用 Mortar 的 cPython 发行版,它至少需要 pig0.12。尝试使用jython脚本引擎。

REGISTER '/data/pyudf/test.py' USING jython AS myudfs;
C = FOREACH B generate myudfs.commaFormat($1);

或者,您可以使用 REPLACE 函数轻松删除逗号,而不是编写 UDF。

REGISTER /path/piggybank.jar;
DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage();
A = LOAD '/result.csv' using CSVExcelStorage() AS (id:int,lastvisitedtime:chararray,title:chararray,typedcount:int,URL:chararray,visitcount:int,bytes:int);
B = FOREACH A GENERATE id,REPLACE(lastvisitedtime,',',''),title,typedcount,URL,visitcount,bytes;
C = LIMIT B 15;
DUMP C;
于 2017-01-15T23:19:05.023 回答