1. 程式人生 > >[Hive08]從Hive中的stored as file_foramt看Hive調優

[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]Hivestored as file_foramtHive調

一、行式儲存與列式儲存 行式資料庫 對比 列式資料庫 行式資料庫儲存在hdfs上式按行進行儲存的,一個block儲存一或多行資料。 而列式資料庫在hdfs上則是按照列進行儲存,一個block可能有一列或多列資料。 如果要將資料進行壓縮: 對於行式資料庫,必然按行壓縮

hiveLateral 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指令碼Hiveload資料並存入到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>();

hiveurl提取需要的部分字串

本人菜鳥一隻,如果有什麼說錯的地方還請大家批評指出!! 事情是這樣的,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

HiveHDFS載入資料

建表         以手機流量資訊為例插入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(

使用SqoopPostgreSQL向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.