Hadoop/Hive新手在這裏。我正在嘗試使用Hive以自定義文本格式存儲的數據。我的理解是,你可以寫一個自定義FileFormat
或自定義SerDe
類來做到這一點。是這種情況還是我誤解了它?什麼時候選擇哪個選項的一般指導原則是什麼?謝謝!使用FileFormat v Serde讀取自定義文本文件
回答
我想通了。畢竟我不必寫一個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。另外,當使用自定義輸入格式時,需要指定輸出格式,因此我選擇了其中一種內置輸出格式。
如果您使用的是Hive,請編寫一個serde。請參閱以下示例: https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2
請注意,此接口是Hive特定的。如果你想使用自定義文件格式來定期做Hadoop作業,你必須實現一個單獨的界面(我不完全確定哪一個)。
如果您已經知道如何反序列化另一種語言的數據,那麼您只需編寫一個流式作業(使用任何語言)並使用您現有的庫。
希望有幫助
取決於您從文本文件中獲得的內容。
您可以編寫一個自定義記錄閱讀器來解析文本日誌文件並以您想要的方式返回,輸入格式類爲您完成那項工作。您將使用此jar創建Hive表並在該表中加載數據。
談到SerDe,我用它有點不同。我使用InputFormat和SerDe,前者分析實際數據,後者用於表示實際數據的元數據穩定。我爲什麼那樣做?我想爲我的日誌文件的每一行在配置單元表中創建適當的列(不多或少),我認爲SerDe對我來說是完美的解決方案。
最後我映射這兩個來創建一個最終表,如果我想要或保留這些表,以便我可以通過連接來查詢這些表。
我喜歡Cloudera博客的解釋。
http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/
基本上你需要理解上的差異,當修改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。
- 1. 閱讀使用文本框啓動的自定義文件
- 2. IOS自定義文件讀取
- 3. vb.net讀取文本文件中的自定義標記之間的文本
- 4. 使用自定義配置類讀取自定義配置文件?
- 5. 如何使用Aspose.Tasks從mpp文件讀取自定義列值
- 6. 使用NSBundle從自定義目錄中讀取圖像文件
- 7. 使用自定義文件格式讀取配置單元中的xml文件
- 8. 使用argv讀取文本文件
- 9. Javascript:使用AJAX讀取文本文件
- 10. 使用OpenMP讀取文本文件
- 11. 使用matlab讀取文本文件
- 12. 使用Javascript讀取文本文件
- 13. 使用C++讀取文本文件
- 14. 使用SQL Server讀取文本文件
- 15. 使用Javascript讀取文本文件
- 16. 使用MPI-IO讀取文本文件?
- 17. 使用swift讀取文本文件
- 18. 使用python讀取文本文件
- 19. 使用Ajax讀取csv /文本文件
- 20. 使用HTML讀取文本文件
- 21. 使用PHP讀取文本文件
- 22. 使用ajax從文本文件中讀取特定的文字
- 23. 從自定義ListView中獲取文本
- 24. 如何閱讀C++中的自定義格式文本文件
- 25. 從自定義分隔符的文件中讀取文本字段
- 26. 使用python讀取MS Word文件中的自定義文檔屬性
- 27. 閱讀以文本結尾的自定義文件
- 28. 將文本文件讀入自定義數據類
- 29. 使用PowerShell腳本閱讀PDF文件自定義文檔屬性
- 30. 在java中讀取文本文件的定義行
你願意分享你的代碼嗎? Java + hadoop新手在這裏。我試圖解壓縮一個文件,解壓縮時是單行,但有時壓縮時有換行符。 Hadoop在換行符上打破它,所以數據最終損壞。我正在嘗試爲蜂巢製作一個插件。我知道這是一個古老的線索,但有問題。謝謝 – Jeff