我想使用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」,但是然後單個映射操作必須處理多個創建/插入操作,這使得工作的平衡非常糟糕。我真的很喜歡每個插入或創建一個映射操作。
我不負責創建轉儲文件,因此我無法更改初始轉儲文件的佈局。
我其實沒有線索什麼是最好的解決方案,我可以使用一些幫助:)。如有需要,我可以提供任何附加信息。
這個正則表達式如何提取所有有效的行https://regex101.com/r/myrLaA/1?注意:如果沒有示例數據,很難爲您提供一個很好的答案。 –
對不起,我真的不清楚真正的問題。正則表達式沒問題,我只是很難理解Hadoop映射機制。我使用Hadoop中的grep mapreduce示例(https://wiki.apache.org/hadoop/Grep)開始工作,但此示例的映射操作是每行一行的函數,所以我無法檢索完整的SQL行相反,我只是寫映射器並使其處理整個文件而不是使用標準的grep。 Thx爲你的幫助無論如何:) –