2015-04-28 78 views
0

我有一个名为“filelist.txt”的文件,这个文件的内容是我想读入我的猪脚本的列表文件。例如,它可以为组织:如何从Apache Pig中的文件中读取多个文件?

file1.txt 
file2.txt 
... 
filen.txt 

一些解决方案,尝试使用正则表达式,但没有在文件名没有特定的格式,我们可以做的唯一的事情就是阅读从文件名filelist.txt

在每个文件中是我想要读取的实际数据。例如,在file1中,我们可以有:

value1 
value2 
value3 

那么我应该如何读取猪脚本中的所有这些文件值呢?

回答

0

你必须使用猪负载FUNC和覆盖setlocation

@Override 
    public void setLocation(String location, Job job) throws IOException { 
     //Read location where you have all the input file names and convert that into a comma seperated string. 
     FileInputFormat.setInputPaths(job, [commaseperated list]); 
    } 

凡位置将是逗号分隔的文件列表。

+0

我没有得到它。看来你已经知道文件的格式了。但我想要的是读取文件名在另一个文件列表中的文件。我应该怎么做? – user2970089

+0

是的,我误解了早期版本。我认为上面的一个看起来不错。不知道它是否解决了问题。 –

0

目前无法在纯猪身上做到这一点。你可以在纯猪身上做的最好的事情就是使用它们的内置气球,你可以找到关于here的信息。这是相当灵活的,但听起来不足以达到您的目的。

我能想到的另一个解决方案是,如果您可以在您的本地环境中获取该文件,则使用某种wrapper (I would recommend python)。在该脚本中,您可以读取该文件并生成猪脚本来读取这些行。下面是逻辑将如何工作:

def addLoads(filesToRead, schema, delim='\\t'): 

    newLines = [] 
    with open(filesToRead, 'r') as infile: 

     for n, f in enumerate(infile): 
      newLines.append("input{} = LOAD '{}' USING PigStorage('{}') AS {};".format(n, f, delim, schema)) 

    to_union = [ 'input{}'.format(i) for i in range(1, len(newLines)+1) ] 

    newLines.append('loaded_lines = UNION {} ;'.format(', '.join(to_union))) 

    return '\n'.join(newLines) 

追加这个给你从磁盘加载脚本猪的开始,并确保脚本的其余部分使用loaded_lines作为开始。