我正在尝试使用jar文件并将其功能导入到python脚本中。jar文件与python脚本和pig脚本位于同一目录中
脚本.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)
脚本.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;
这是一个非常简单的自定义项,我试图使用,但由于某种原因,我总是得到一个错误,说“没有模块命名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条答案
按热度按时间gajydyqb1#
如果您在pig map reduce模式下运行这个脚本,您需要在作业运行时使jar可用。在pig脚本的顶部,您需要添加以下行
那你就得发表评论了
sys.path.append('/home/hadoop/scripts/jyson-1.0.2.jar')
从你的自定义项脚本。jar中的类已经可以用于udf,因为您已经用pig脚本注册了这些类。所以我需要改变sys.path
希望有帮助。