apache pig—访问存储在hdfs分布式缓存中的python脚本中的文件

von4xj4u  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(360)

我有一个python脚本,需要访问和查询maxmind(.mmdb)文件类型。我目前的想法是将maxmind文件加载到hdfs的分布式缓存中,然后通过pig将其传递给我的python脚本。我现在的Pig剧本是:

SET mapred.cache.file /path/filelocation/;
SET mapred.createsymlink YES;
SET mapred.cache.file hdfs://localserver:8020/pathtofile#filename;
REGISTER 'pythonscript' USING jython AS myudf;
logfile= LOAD 'filename' USING PigStorage(',') AS (x:int);
RESULT = FOREACH logfile GENERATE myudf.pyFunc(x,"how to pass in MaxMind file");

在将文件加载到python脚本内部的分布式缓存之后,您对如何访问该文件有何想法?
谢谢

vyswwuz2

vyswwuz21#

我想你可以这样做:

set mapred.cache.files hdfs:///user/cody.stevens/testdat//list.txt#filename;
SET mapred.createsymlink YES; 
REGISTER 'my.py' USING jython AS myudf;
a = LOAD 'hdfs:///user/cody.stevens/pig.txt' as (x:chararray);
RESULT = FOREACH a GENERATE myudf.list_files(x,'filename');
STORE RESULT into '$OUTPUT';

这是我在这个例子中使用的对应的my.py


# /usr/bin/env python

import os 

@outputSchema("ls:chararray}")
def list_files(x,f):
    #ls =  os.listdir('.')
    fin = open(f,'rb')
    return [x,fin.readlines()]

if __name__ == '__main__':
    print "ok"

差点忘了。。我是这么叫的。

pig -param OUTPUT=/user/cody.stevens/pigout -f dist.pig

它应该在您的本地目录中,以便python能够访问它。在该示例中,“filename”是符号链接的名称,您必须相应地进行更新。在您的例子中,您希望您的“filename”是您的maxmind文件,并且根据您在“a”中的值是什么,您可能需要将其更改回“as(x:int)”。
祝你好运!

相关问题