2011-10-12 43 views
7

Hadoop/Hive新手在這裏。我正在嘗試使用Hive以自定義文本格式存儲的數據。我的理解是,你可以寫一個自定義FileFormat或自定義SerDe類來做到這一點。是這種情況還是我誤解了它?什麼時候選擇哪個選項的一般指導原則是什麼?謝謝!使用FileFormat v Serde讀取自定義文本文件

回答

11

我想通了。畢竟我不必寫一個serde,寫了一個自定義的InputFormat(擴展爲org.apache.hadoop.mapred.TextInputFormat),它返回一個自定義的RecordReader(實現org.apache.hadoop.mapred.RecordReader<K, V>)。 RecordReader實現邏輯來讀取和解析我的文件並返回製表符分隔的行。

有了,我宣佈我的表作爲

create table t2 ( 
field1 string, 
.. 
fieldNN float)   
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'  
STORED AS INPUTFORMAT 'namespace.CustomFileInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 

這將使用本地SERDE。另外,當使用自定義輸入格式時,需要指定輸出格式,因此我選擇了其中一種內置輸出格式。

+0

你願意分享你的代碼嗎? Java + hadoop新手在這裏。我試圖解壓縮一個文件,解壓縮時是單行,但有時壓縮時有換行符。 Hadoop在換行符上打破它,所以數據最終損壞。我正在嘗試爲蜂巢製作一個插件。我知道這是一個古老的線索,但有問題。謝謝 – Jeff

1

如果您使用的是Hive,請編寫一個serde。請參閱以下示例: https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2

請注意,此接口是Hive特定的。如果你想使用自定義文件格式來定期做Hadoop作業,你必須實現一個單獨的界面(我不完全確定哪一個)。

如果您已經知道如何反序列化另一種語言的數據,那麼您只需編寫一個流式作業(使用任何語言)並使用您現有的庫。

希望有幫助

2

取決於您從文本文件中獲得的內容。

您可以編寫一個自定義記錄閱讀器來解析文本日誌文件並以您想要的方式返回,輸入格式類爲您完成那項工作。您將使用此jar創建Hive表並在該表中加載數據。

談到SerDe,我用它有點不同。我使用InputFormat和SerDe,前者分析實際數據,後者用於表示實際數據的元數據穩定。我爲什麼那樣做?我想爲我的日誌文件的每一行在配置單元表中創建適當的列(不多或少),我認爲SerDe對我來說是完美的解決方案。

最後我映射這兩個來創建一個最終表,如果我想要或保留這些表,以便我可以通過連接來查詢這些表。

我喜歡Cloudera博客的解釋。

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

6

基本上你需要理解上的差異,當修改SERDE和當修改FILEFORMAT。

從官方文檔:Hive SerDe

什麼是SERDE? 1.SerDe是「串行器和解串器」的簡稱。 2.Hive使用SerDe(和FileFormat)讀取和寫入表格行。 3.HDFS文件 - > InputFileFormat - > - >解串器 - >行對象 4。Row object - > Serializer - > - > OutputFileFormat - > HDFS文件

所以,第3和第4點是明確推斷的區別。 當您想以不同於平常的方式(記錄由'\ n'分隔)讀取記錄時,您需要自定義文件格式(輸入/輸出)。 當你想以自定義的方式解釋讀取記錄時,你需要定製SerDe。

我們來看一個常用格式JSON的例子。

場景1: 假設您有一個輸入json文件,其中一行包含一個json記錄。 因此,現在您只需要Custom Serde以您想要的方式解釋讀取記錄。 不需要自定義輸入格式,因爲1行將是1條記錄。

方案2: 現在,如果您有您的一個JSON記錄跨越多行的輸入文件和你想讀它,因爲它是那麼 你應該先寫一個自定義的輸入格式在1個JSON記錄讀取和那麼這個讀取的json記錄將會轉到Custom SerDe。