[Hive08]從Hive中的stored as file_foramt看Hive調優
一、行式儲存與列式儲存
行式資料庫 對比 列式資料庫
行式資料庫儲存在hdfs上式按行進行儲存的,一個block儲存一或多行資料。
而列式資料庫在hdfs上則是按照列進行儲存,一個block可能有一列或多列資料。
如果要將資料進行壓縮:
對於行式資料庫,必然按行壓縮,當一行中有多個欄位,各個欄位對應的資料型別可能不一致,壓縮效能壓縮比就比較差。
對於列式資料庫,必然按列壓縮,每一列對應的是相同資料型別的資料,故列式資料庫的壓縮效能要強於行式資料庫。
如果要進行資料的查詢:
假設執行的查詢操作是:select id,name from table_emp;
對於行式資料庫,它要遍歷一整張表將每一行中的id,name欄位拼接再展現出來,這樣需要查詢的資料量就比較大,效率低。
對於列式資料庫,它只需找到對應的id,name欄位的列展現出來即可,需要查詢的資料量小,效率高。
假設執行的查詢操作是:select * from table_emp;
對於這種查詢整個表全部資訊的操作,由於列式資料庫需要將分散的行進行重新組合,行式資料庫效率就高於列式資料庫。
但是,在大資料領域,進行全表查詢的場景少之又少,進而我們使用較多的還是列式資料庫及列式儲存。
二、Hive中的儲存格式
樣例:
stored as file_format
create table table_name(
.....)
row format...."\t"
stored as file_format;
建立一張表時,可以使用“stored as file_format”來指定該表資料的儲存格式,hive中,表的預設儲存格式為TextFile。
第一種方式:
CREATE TABLE tt (
id int,
name string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
Hive的預設儲存格式就是textfile,可以通過引數hive.default.fileformat進行更改。
第二種方式:
CREATE TABLE tt2 (
id int,
name string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE;
第三種方式:
CREATE TABLE tt3 (
id int,
name string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
#以上三種方式儲存的格式都是TEXTFILE。
file_format:
|
SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.
default
.fileformat configuration)
| RCFILE -- (Note: Available in Hive
0.6
.
0
and later)
| ORC -- (Note: Available in Hive
0.11
.
0
and later)
| PARQUET -- (Note: Available in Hive
0.13
.
0
and later)
| AVRO -- (Note: Available in Hive
0.14
.
0
and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
三、儲存格式講解
以下來詳細介紹TEXTFILE、SEQUENCEFILE、RCFILE、ORC等四種
儲存格式及它們對於hive在儲存資料和查詢資料時效能的優劣。
TEXTFILE:
只是hive中表資料預設的儲存格式,它將所有型別的資料都儲存為String型別,不便於資料的解析,但它卻比較通用。
不具備隨機讀寫的能力。支援壓縮。
SEQUENCEFILE:
這種儲存格式比TEXTFILE格式多了頭部、標識、資訊長度等資訊,這些資訊使得其具備隨機讀寫的能力。
支援壓縮,但壓縮的是value。(儲存相同的資料,SEQUENCEFILE比TEXTFILE略大)
RCFILE(Record Columnar File):
現在水平上劃分為很多個Row Group,每個Row Group預設大小4MB,Row Group內部
再按列儲存資訊。由facebook開源,比標準行式儲存節約10%的空間。
ORC:
優化過後的RCFile,現在水平上劃分為多個Stripes,再在Stripe中按列儲存。每個Stripe由一個Index Data、一個Row Data、
一個Stripe Footer組成。每個Stripes的大小為250MB,每個Index Data記錄的是整型資料最大值最小值、字串資料前後
綴資訊,每個列的位置等等諸如此類的資訊。這就使得查詢十分得高效,預設每一萬行資料建立一個Index Data。ORC儲存
大小為TEXTFILE的40%左右,使用壓縮則可以進一步將這個數字降到10%~20%。
ORC這種檔案格式可以作用於表或者表的分割槽,可以通過以下幾種方式進行指定:
CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc
-
The parameters are all placed in the TBLPROPERTIES (see Create Table). They are:
Key
Default
Notes
orc.compress
ZLIB
high level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size
262,144
number of bytes in each compression chunk
orc.stripe.size
67,108,864
number of bytes in each stripe
orc.row.index.stride
10,000
number of rows between index entries (must be >= 1000)
orc.create.index
true
whether to create row indexes
orc.bloom.filter.columns "" comma separated list of column names for which bloom filter should be created orc.bloom.filter.fpp 0.05 false positive probability for bloom filter (must >0.0 and <1.0)
示例:
create table page_views_orc_zlib
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS ORC
TBLPROPERTIES("orc.compress"="ZLIB")
as select * from page_views;
For example, creating an ORC stored table without compression:
create table Addresses (
name string,
street string,
city string,
state string,
zip int
) stored as orc tblproperties ("orc.compress"="NONE");
PARQUET:
儲存大小為TEXTFILE的60%~70%,壓縮後在20%~30%之間。
注意:
不同的儲存格式不僅表現在儲存空間上的不同,對於資料的查詢,效率也不一樣。因為對於不同的儲存格式,執行相同的查詢操作,他們訪問的資料量大小是不一樣的。
我做過一個實驗:
資料量一樣都是18.1MB的幾張表,執行某個操作,使用TEXTFILE儲存,訪問的資料量19022700,使用RCfile儲存,訪問的資料量3725391,使用ORC儲存,訪問的資料量1810082,使用ORC儲存並使用ZLIB格式壓縮,訪問的資料量1257539.
select count(1) from page_views where session_id='B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1';
19022700
select count(1) from page_views_rcfile where session_id='B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1';
3725391
select count(1) from page_views_orc where session_id='B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1';
1810082
select count(1) from page_views_orc_zlib where session_id='B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1';
1257539
不同格式儲存相同資料的大小:
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
如果要使用TEXTFILE作為hive表資料的儲存格式,則在必須先存在一張相同資料的儲存格式為TEXTFILE的表table_t0,然後在建表時使用“insert into table table_stored_file_ORC select * from table_t0;”建立。或者使用"create table as select *from table_t0;"建立。
相關推薦
[Hive08]從Hive中的stored as file_foramt看Hive調優
一、行式儲存與列式儲存 行式資料庫 對比 列式資料庫 行式資料庫儲存在hdfs上式按行進行儲存的,一個block儲存一或多行資料。 而列式資料庫在hdfs上則是按照列進行儲存,一個block可能有一列或多列資料。 如果要將資料進行壓縮: 對於行式資料庫,必然按行壓縮
hive中Lateral View用法 與 Hive UDTF explode的用法
Lateral View是Hive中提供給UDTF的conjunction,它可以解決UDTF不能新增額外的select列的問題。1. Why we need Lateral View?當我們想對hive表中某一列進行split之後,想對其轉換成1 to N的模式,即一行轉多
tomcat中使用apr及性能調優
error jdk1 rec less ken install earch als head tomcat8使用apr及性能調優本次安裝的軟件包括:jdk1.7.0_79apache-tomcat-8.0.0-RC1.tar.gzapr-1.5.2.tar.gzapr-ic
Linux服務器性能查看分析調優
快照 stat 暫時 數據庫服務 由於 The center dns緩存 物理 一 linux服務器性能查看 1.1 cpu性能查看 1、查看物理cpu個數: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l 2、
Oracle中各個命中率的總結及調優
Oracle中各個命中率的總結及調優 關於Oracle中各個命中率的計算以及相關的調優 1)Library Cache的命中率: .計算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL>SELECT SUM(pinhits)/sum(p
Keras/Python深度學習中的網格搜尋超引數調優(附原始碼)
超引數優化是深度學習中的重要組成部分。其原因在於,神經網路是公認的難以配置,而又有很多引數需要設定。最重要的是,個別模型的訓練非常緩慢。在這篇文章中,你會了解到如何使用scikit-learn python機器學習庫中的網格搜尋功能調整Keras深度學習模型中的
利用sqoop從 hive中往mysql中導入表出現的問題
ive ptr 解析 修改 技術 字段 map temp article 這個錯誤的原因是指定Hive中表字段之間使用的分隔符錯誤,供Sqoop讀取解析不正確。如果是由hive執行mapreduce操作匯總的結果,默認的分隔符是 ‘\001‘,否則如果是從HDFS文件導入
Pig指令碼從Hive中load資料並存入到Hbase中
1、我們先建一個Hive表test01: create table test01(name String, age int, phone String,province String, city String) ROW FORMAT DELIMITED FIELDS TERMINATED B
從hive中獲取資料
MySQL中獲取資料 public RestMsg<Object> getZhen( HttpServletRequest request) { RestMsg<Object> rm = new RestMsg<Object>();
【hive】從url中提取需要的部分字串
本人菜鳥一隻,如果有什麼說錯的地方還請大家批評指出!! 事情是這樣的,hive的A表中,有url這樣的一個欄位,我想要提取這個欄位中的某一部分(這不就是擷取字串嘛)。但是substring肯定是滿足不了我的需求的,自己寫hive的udf也不太現實(用最簡單的方式完成任務,才會讓後來的維護變得更加
利用sqoop指定列指定條件的方式將資料從mysql中增量匯入hive表中
========1、sqoop增量(指定列指定條件的方式增量匯入hive表中)匯入hive指令碼======= #!/bin/bash #Set the RDBMS connection params rdbms_ip=$1 rdbms_connect="jdbc:mysq
Hive從HDFS中載入資料
建表 以手機流量資訊為例插入30w行資料 create table flow(id string,phonenum string,mac string,ip string,num1 int,num2 int,up in
hive 從Excel中匯入資料
拿到Excel表後將資料保留,其他的亂七八糟都刪掉,然後另存為txt格式的文字,用nodepad++將文字轉換為UTF-8編碼,此處命名為cityprovince.txt 將cityprovince.txt傳入操作的Linux環境中 hive建表,注
從costco的戰術體系,看寒冬中都在說的會員經濟到底是什麼?
去年有兩家公司在香港上市了,小米和拼多多,他們在招股書裡都提到了一個自己的對標企業:costco(好事多)。這個能讓這兩家巨頭都想學習的 costco 到底是什麼來頭? costco 創建於 80 年代的美國,在一個普通的不能再普通的零售超市行業開創了一個神話: 像拼多多一樣逆勢增長:近 5 年在亞
Hive實現從表中隨機抽樣得到一個不重複的資料樣本
方法一: select * from table_a order by rand() limit 100; 方法二: select * from ( select e.*, cast(
使用Sqoop從PostgreSQL向Hive中遷移資料遇到的問題
postgreSQL的介面 跟mysql不同之處就是,多了一個 2 ,這也是導致資料遷移錯誤原因 1.資料庫名稱 2.schema 3.表名 PostgreSQL中的物件屬於三層模型,即database->schema->table。
hive裡如何快速查看錶中有多少記錄數
方法一:在hue介面的hive下找到相應的表,即可看到表的行數和大小等資訊。方法二編寫指令碼,[[email protected] hive]# cat count_tables.sh myorder=1while read line;doeval "hive --
hive從查詢中獲取資料插入到表或動態分割槽
轉自:http://www.crazyant.net/1197.html Hive的insert語句能夠從查詢語句中獲取資料,並同時將資料Load到目標表中。現在假定有一個已有資料的表staged_employees(僱員資訊全量表),所屬國家cnty和所屬州st是該表
hive 自定定義函式 從hdfs中載入jar
1、編寫函式 package com.example.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public final cl
資料從mysql中匯入hive表中異常解決:
將資料從mysql中匯入hive表中,出現異常ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf.