2014-11-24 95 views
1

來自相對Hadoop/Hive新手的問題:如何將Microsoft Word(二進制)文檔的內容作爲參數傳遞給Hive函數?Microsoft Word二進制文件如何存儲在Hive中?

我的目標是能夠將一個二進制文件(在我的特殊用例中是一個Microsoft Word文檔)的完整內容作爲二進制參數提供給UDTF。我最初的方法是將文件的內容啜到一個臨時表中,然後將其提供給UDTF在查詢以後,這是我如何試圖建立一個臨時表:

create table worddoc(content BINARY); 
load data inpath '/path/to/wordfile' into table worddoc; 

遺憾的是,似乎有成爲Word文檔中的換行符(或者像換行符那樣行事的東西),導致登臺表有許多行而不是單個全面的blob,後者是我所希望的。有沒有辦法確保攝取不會爆炸成多行?我在這裏看到過類似的關於其他二進制數據的問題,比如圖像文件,所以我猜測它是讓我絆倒的換行符。

失敗所有,有沒有辦法跳過在中間Hive表中存儲文件的內容,只是在調用時直接提供內容到UDTF?在我通過Hive的內置函數進行搜索時,沒有什麼明顯的跳出來,但也許我錯過了一些東西。

從版本角度看,環境是Hive 0.13.1和Hadoop 1.2.1(儘管升級到兩者都未決)。

回答

1

這是一個黑客-Y的解決方法,但我落得這樣做是這樣的:

1)Base64編碼的二進制文件,並把編碼後的文件到HDFS

2)在蜂巢:

CREATE TABLE staging_table (content STRING); 
LOAD DATA INPATH '/path/to/base64_encoded_file' INTO TABLE staging_table; 
CREATE TABLE target_table (content BINARY); 
INSERT INTO target_table SELECT unbase64(content) FROM staging_table; 

理論上這應該適用於任何想要以這種方式擠入Hive的任意二進制文件。需要注意的是確保你的base64編碼實現生成單行文件(我的OS X base64實用程序生成單行輸出,而我使用的CentOS 6 VM中的base64實用程序生成了數百行) - 如果沒有,你可以手動將它粘貼到HDFS中。

相關問題