访问存储在 HDFS 分布式缓存中的 python 脚本中的文件
Access a file in a python script that is stored in HDFS distributed cache
我有一个 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 脚本内部的分发缓存后如何访问文件的任何想法?
谢谢
我想你可以这样做:
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' 是符号 link 的名称,您必须相应地进行更新。在你的情况下,你会希望你的 'filename' 成为你的 maxmind 文件,并且根据你在 'a' 中的值,你可能需要将其更改回 'as (x:int)'。
祝你好运!
我有一个 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 脚本内部的分发缓存后如何访问文件的任何想法?
谢谢
我想你可以这样做:
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' 是符号 link 的名称,您必须相应地进行更新。在你的情况下,你会希望你的 'filename' 成为你的 maxmind 文件,并且根据你在 'a' 中的值,你可能需要将其更改回 'as (x:int)'。
祝你好运!