2017-06-28 57 views
1

我想使用Apache Hadoop來解析大文件(每個〜20 MB)。這些文件是postegresql轉儲(即主要是CREATE TABLE和INSERT)。我只需要過濾掉任何不是CREATE TABLE或INSERT INTO的東西。Hadoop grep轉儲sql

所以決定用grep地圖^(CREATE TABLE|INSERT).*;$圖案降低(線開始CREATE TABLE或INSERT和一個結束「;」)。 我的問題是其中一些創建和插入採取多行(因爲架構真的很大,我猜),所以模式根本無法匹配它們(如CREATE TABLE test(\n "id"....\n..."name"...\n );

我想我可以寫一個mapreduce工作來重構每條「插入」和「創建」在一行上,但這將是非常昂貴,因爲文件很大。我也可以從文件中刪除所有「\ n」,但是然後單個映射操作必須處理多個創建/插入操作,這使得工作的平衡非常糟糕。我真的很喜歡每個插入或創建一個映射操作。

我不負責創建轉儲文件,因此我無法更改初始轉儲文件的佈局。

我其實沒有線索什麼是最好的解決方案,我可以使用一些幫助:)。如有需要,我可以提供任何附加信息。

+0

這個正則表達式如何提取所有有效的行https://regex101.com/r/myrLaA/1?注意:如果沒有示例數據,很難爲您提供一個很好的答案。 –

+0

對不起,我真的不清楚真正的問題。正則表達式沒問題,我只是很難理解Hadoop映射機制。我使用Hadoop中的grep mapreduce示例(https://wiki.apache.org/hadoop/Grep)開始工作,但此示例的映射操作是每行一行的函數,所以我無法檢索完整的SQL行相反,我只是寫映射器並使其處理整個文件而不是使用標準的grep。 Thx爲你的幫助無論如何:) –

回答

0

首先第一件事情: 20 MB的文件並不大文件到Hadoop的標準,你可能有很多的文件(除非你只有數據很少量的),所以應該有大量的並行化成爲可能。

因此,每個文件有1個映射器可能是一個很好的解決方案,而且您甚至可能想要連接文件以減少開銷。


話雖這麼說:

如果你不希望一次處理所有行,以及處理一行一次是不夠的,那麼唯一的簡單的解決辦法是處理「幾「線一次,例如2或3

另一種解決方案是印章的文件和使用每一個filepart地圖,但你要麼需要處理的邊緣,或接受你的解決方案可能無法刪除一個所需的位。

我意識到這仍然是一個相當概念性的答案,但根據目前爲止的進展,我覺得這可能足以讓你到達那裏。

+0

這實際上是我正在尋找的答案!正如你所提到的,20 MB的文本文件對於Hadoop來說並不是很大,我有足夠的文件(現在大約有500個文件,將來可能會增長)來完成我需要的並行化。它只會增加將文件分割成許多映射操作而不是映射一次的開銷。同樣如你所說,在開始地圖操作之前,我更有可能連接我的文件,而不是分割每個文件。您的替代解決方案也幫助我理解問題。 Thx很多答案。 –