hive表存儲格式化
A. 怎樣修改hive存儲格式為snappy格式
你輸入sqoop
import
的目錄在哪裡?如果在/usr/sqoop下輸入的命令,那麼在/usr/sqoop下輸入hive登入,然後show
tables查看。
你輸入sqoop
import
的目錄在哪裡?如果在/usr/sqoop下輸入的命令,那麼在/usr/sqoop下輸入hive登入,然後show
tables查看。
hive
0.13以後自帶支持。
B. 【大數據-數倉】HIVE下的文件存儲遇到的一個問題(TEXTFILE、RCFILE)
問題:
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
解決:
當遇到這個肆激問題時,可以肯定一點的是,文件的格式和建表時指定的存儲格式是不一致的。
由此可以定位到問題出在納雹宴哪裡了。
1.確定數洞銀據源的格式:
一般都是txt/csv文件
2.確定建表時指定的存儲格式
show create table table_name;
然後查看:
STORED AS INPUTFORMAT #指定的存儲格式
3.重新建表並修改指定的存儲格式
C. [hive]一種基於Hive日誌分析的大數據存儲優化方法_王正也_百度文庫
一種悄或基於Hive日誌分析的大數據存儲優化方法 王正也 網路文庫
http://wenku..com/link?url=-
2 一種基於Hive日誌的大數據存儲優化方法
2.1 優化方法概述
Hive作為Hadoop開源分布式平台下的數據倉庫工具,他的作用是HDFS上存儲的結構化數據,根據使用者的需求將其映射出數據表,並可以向用戶提供類似SQL的HiveQL查詢功能,並將用戶提交的Query轉換成Map-Rece任務執行。Hive的優點是提供類SQL的查詢介面,快速實現數據的統計分析功能,而不必編寫專用的Map-Rece任務。而也正是因為如此,通用的Hive數據倉庫,沒有進行專用化的優化設計,其查詢分析效率也有很大的優化空間[4]。
文章根據常用的HiveQL的查詢日誌分析和根據現有的數據存儲結構的關聯特性提出一種通用的Hive數據存儲的優化方法。
本策略認為優化一個專用的Hive海量數據倉庫分為以下幾個步驟: 1. 分析常用查詢日誌,根據使用人員習慣定製數據分區結構。 2. 使用專用的優化過的列式存儲結構作為數據導入格式。 3. 根據數據表,和表中欄位的實際物理意義塵攜合並壓縮重復欄位和數據表。 4. 根據數據表中欄位實際的取值優化欄位的存儲類型。 5. 編寫UDF,在不改變用戶使用習慣的基礎上,應用上述優化。 其中1.2.兩點在數據導入階段進行優化,3.4.5.是在對數據表欄位和表結構的優化,需要配合UDF來進行。通過上述優化過程可以大大節省HiveQL的查詢時間以及HDFS上數據的佔用空間。
2.2 根據查詢日誌進行分區優化
Hive的日誌記錄了Hive的運行狀況,為本文分析操作者的使用習慣提供了很大的幫助。可以通過編寫Hive的EXPAIN功能進行日誌的分析,利用Hive的EXPLAIN功能,本文可以得到查詢語句的抽象語法樹(ABSTRACT SYNTAX TREE),通過抽象語法樹,本文可以快速得到查詢語句的語法結構。
例如,以下一條語句SELECT col1, SUM(col2) FROM tab1 GROUP BY col1的通過EXPLAIN命令本文可以得到如下結果:
ABSTRACT SYNTAX TREE:
(TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME tab1))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL col1)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL col2)))) (TOK_GROUPBY (TOK_TABLE_OR_COL col1))))
可以通過使用正則表達式抓取特徵數據,得到該語句的語法結構,同時通過編寫Shell腳本,批量執行EXPLAIN命令,可以很快的啟兄伍理解到使用者的常用語法習慣,為後文的分區優化提供了數據支持。 通過對使用者常用欄位進行分區(partition),帶來的便利是大大的節省了一些常用查詢的在硬碟中讀取數據所消耗的時間。 通常在沒有進行過優化的Hive系統中,每次查詢提交之後,Hive要對輸入數據進行全盤掃描滿足條件的的項目,通過合理的劃分分區,在單次任務提交後,可以按照任務的限定條件只掃描某些關鍵分區的數據,大大提高的Hive查詢執行的效率。
2.3 選取合適的Hive數據存儲格式
在Hive中數據表創建時需要指定文件存儲格式,在Hive0.90版本中,常用的數據格式分為TEXTFILE、SEQUNCEFILE、RCFILE和用戶自定格式等幾種,以上格式的主要區別在行式存儲與列式存儲,不同壓縮演算法等方面的區別。根據Hive數據表格的特性,和通過Hive日誌觀察到的用戶使用習慣等特性,通過選擇合適的文件存儲格式,可以大大提高查詢效率,減少查詢耗費時間。
4 結論
本文給出了一種基於Hive日誌分析的大數據存儲優化方法,通過實際測試可以看出,使用該優化方法的Hive數據存儲系統無論從磁碟空間利用率還是從查詢效率上都得到和很大提升。
D. hive存儲parquet表
parquet格式的表在生產環境中經常被使用到,具有列式存儲和壓縮等特點,我們怎麼在hive中存儲parquet格式的表呢。
這里使用oracle的emp表
載入本地數據到hive表
執行查詢
發現報錯
emp使用parquet格式存儲,其中imputFormat和outputFormat都是parquet的相關的,也前冊就是我的imputFormat是parquent的,但是你傳過來的是text,我不認識
我們看一下emp的相關信息,可以看到這里的都是parquet的format的,這是導致這次錯誤的原因。
這就導致了我們需要每次都先把text文件轉化為parquet的文件,然後parquent表進行載入才可以,下面介紹官方推薦的使用方法。
查看emp_tmp的表的信息,這里可以看到,默認的是TextImputFormat和TextOutputFormat的。
然後載入數據到emp_tmp,查看數據,是正常顯示的
然後現在把之前的emp裡面的數據給刪除
然後把emp_tmp表裡面的數據載入到emp
查詢一下,數據滑談正常顯示,這個方式使用起來還行,就是每次都需要對臨時表進行操作,還是比較麻煩的。
感覺這個問題是經常出現,為什麼會這樣呢。這個和hive的版本有一定的關系。
可以看出hive官方將inputformat和outputformat進行了整合,這樣使信悔碰用起來也是比較方便的。
但是可能有人想,那我修改inputformat不就行了,下面我介紹一下,看是否可以
創建emp2表,是parquet的存儲格式的
修改inputformat 和serde,這里inputFormat是TextInputFormat,SEDE使用的是LazySimpleSerDe,Outputformat任然是Parquet的,這里需要帶上。
查看emp2表的信息,如下圖表示修改成功
載入數據到emp2
查詢數據,執行成功
到這里,修改inputformat和serde的方法也介紹完成了,我們以為成功了,但是上hdfs上一看,文件還是txt格式的,所以通過修改inputformat和serde的方法不行。
肯定有人想使用這個方法
這個方法我也嘗試了,但是返回的值全都是null
在僅僅使用hive的時候,如果想把txt文件裡面的數據保存到parquet表裡面的話,可以使用建立臨時表的方法,這個方法也是比較好操作的。
但是其實如果使用spark,flink等分布式計算引擎的話,是可以直接的讀取txt數據保存到parquet表裡面的,框架幫我們做了轉化。這種方式也是我們在工作中經常使用的。
上面也介紹了修改inputformat和ser的方式,秀給inputformat是可以讓txt文件裡面的數據被讀進來的,如果同時還修改了serde為lazysimpleserde的話,這個是把數據保存為text格式的,已經完全和parquet沒有關系了,保存的文件還是txt格式的。僅修改inputformat,但是使用的serde是parquet的,但是數據進出不一致,也是有問題的。
E. Hive數據的序列化格式
1. TextFile
Hive數據表的默認格式,存儲方式:行存儲。
可使用Gzip,Bzip2等壓縮演算法壓縮,壓縮後的文件不支持split。
但在或高反序列化過程中,必須逐個字元判斷是不是分隔符和行結束符,因此反序列化開銷會比SequenceFile高幾十倍。
2. SequenceFile
Hadoop API提供的一種二進制文件,以的形式序列化到文件中,存儲方式:行存儲。
支持三種壓縮選擇:NONE,RECORD,BLOCK。
Record壓縮率低,一般建議使用BLOCK壓縮。
優勢是文件和hadoop api中的MapFile是相互兼容的。
3. RCFile
存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優點:
首先,RCFile 保證同一行的數據位於同一節點,因此元組重構的開銷很低;孫慎
其次,像列存儲一樣,RCFile 能夠利用列維度的數據壓縮,並且能跳過不必要的列讀取;
RCFile的一個行組包括三個部分:
第一部分是行組頭部的【同步標識】,主要用於分隔 hdfs 塊中的兩個連續行組
第二部分是行組的【元數據頭部】,用於存儲行組單元的信息,包括行組中的記錄數、每個列的位元組數、列中每個域的位元組數
第三部分是【表格數據段】,即實際的列存儲數據。在該部分中,同一列的所有域順序存儲。
從圖可以看出,首先存儲了列 A 的所有域,然後存儲列 B 的所有域等。
數據追加:RCFile 不支持任意方式的數據寫操作,僅提供一種追加介面,這是因為底層的 HDFS當前僅僅支持數據追加寫文件尾部。
行組大小:行組變大有助於提高數據壓縮的效率,但是可能會損害數據的讀取性能,因為這樣增加了 Lazy 解壓性能的消耗。而且行組變大會佔用更多的內存,這會影響並發執行的其他MR作業。 考慮到存儲空間和查詢效率兩個方面,Facebook 選擇 4MB 作為默認的行組大小,當然也允許用戶自行選擇參數進行配置。
4. ORCFile
存儲方式:數據按行分塊 每塊按照列存儲
壓縮快 快速列存取
效率比rcfile高,是rcfile的改良版本
5. 自定義格式
用戶可以通過實現inputformat和 outputformat來自定義輸入輸出格式。
6. 總結:
數據倉庫的特點:一次寫入、多次讀取,因此,整體來看, ORCFile 相比其他格式具有較明顯的優勢。
TextFile 默認格式,載入速度最快,可以採用Gzip、bzip2等進衫凱尺行壓縮,壓縮後的文件無法split,即並行處理
SequenceFile 壓縮率最低,查詢速度一般,三種壓縮格式NONE,RECORD,BLOCK
RCfile 壓縮率最高,查詢速度最快,數據載入最慢。
#