2015-04-28 76 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作爲開始。