我正在尝试使用JAR文件并将其功能导入我的python脚本。 jar文件与我的python脚本和pig脚本
位于同一目录中script.py
import sys
sys.path.append('/home/hadoop/scripts/jyson-1.0.2.jar')
from com.xhaus.jyson import JysonCodec as json
@outputSchema('output_field_name:chararray')
def get_team(arg0):
return json.loads(arg0)
script.pig
register 'script.py' using jython as script_udf;
a = LOAD 'data.json' USING PigStorage('*') as (line:chararray);
teams = FOREACH a GENERATE script_udf.get_team(line);
dump teams;
我正在尝试使用这是一个非常简单的UDF,但由于某种原因,我总是会收到一条错误,上面写着“没有名为xhaus的模块”。以下是该jar中的所有类。
$ jar tf jyson-1.0.2.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/xhaus/
com/xhaus/jyson/
com/xhaus/jyson/JSONDecodeError.class
com/xhaus/jyson/JSONEncodeError.class
com/xhaus/jyson/JSONError.class
com/xhaus/jyson/JysonCodec.class
com/xhaus/jyson/JysonDecoder.class
com/xhaus/jyson/JysonEncoder.class
所以xhaus存在于jar中,但出于某种原因,这并没有被提起。当我查看一些教程时,他们可以很好地运行这些脚本。我可能会错过一个愚蠢的细节,请帮助。
修改
这个脚本由pig执行。所以pig脚本调用python脚本。 python脚本使用JysonCodec类。
pig script.pig
答案 0 :(得分:1)
如果您在pig map reduce模式下运行此脚本,则需要在作业运行时使jar可用。在您的猪脚本的顶部,您需要添加以下行
REGISTER /home/hadoop/scripts/jyson-1.0.2.jar;
然后你需要评论sys.path.append('/home/hadoop/scripts/jyson-1.0.2.jar')
来自你的udf脚本。由于您已经使用pig脚本注册了jar,因此jar中的类已经可用于udf。因此需要更改sys.path
希望它有所帮助。