将JAR文件添加到Python脚本

时间:2014-11-07 05:34:54

标签: python hadoop jar apache-pig

我正在尝试使用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

1 个答案:

答案 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

希望它有所帮助。