2013-05-21 41 views
4

我有100 TB的一個文本文件,它具有多條記錄。我們沒有給出每個記錄需要多少行。一條記錄可以是5行,其他可能是6行,另一條可能是4行。它不確定每條記錄的線路大小可能會有所不同。如何處理inputsplit的多行記錄?

所以我不能使用默認的TextInputFormat,我寫了我自己的inputformat和一個自定義的記錄閱讀器,但我的困惑是:當發生分裂時,我不確定每個分裂是否包含完整記錄。記錄的某些部分可以在分裂1中進行,另一部分在分裂2中進行。但這是錯誤的。

所以,你能不能建議如何讓我保證,我全力去記錄在一個InputSplit處理這種情況?

在此先感謝 -JE

回答

2

你需要知道,如果記錄實際上是由人物的一些已知序列分隔。

如果你知道這一點,你可以設置textinputformat.record.delimiter配置參數來分隔記錄。

如果記錄不字符分隔,你需要一些額外的邏輯,例如,統計已知數量的字段(如果有領域的已知數量),並提出,作爲一個記錄。這通常會使事情變得更加複雜,容易出錯和緩慢,因爲還有很多文本處理正在進行。

嘗試確定是否記錄被分隔。也許發佈幾個記錄的簡短例子會有所幫助。

1

在你的記錄的讀者,你需要定義一個算法,通過它可以:

  • 確定您在記錄中間
  • 如何掃描了該記錄和讀取下一個完整記錄

這與TextInputFormat LineReader已經做了什麼相似 - 當輸入拆分具有偏移量時,行記錄讀取器從該偏移量開始向前掃描找到的第一個換行符,然後將該換行符之後的下一個記錄讀取爲首先記錄我t會發射。繫着這一點,如果塊長度達不到EOF的,行記錄讀者會高達和過去塊的末尾找到當前記錄的行結束符。