日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive 行转列和列转行的方法_Hive超详细存储

發布時間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive 行转列和列转行的方法_Hive超详细存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件存儲格式

Hive支持的存儲數據的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。

列式存儲和行式存儲


左邊為邏輯表,右邊第一個為行式存儲,第二個為列式存儲

  • 行存儲的特點
    查詢滿足條件的一整行數據的時候,列存儲則需要去每個聚集的字段找到對應的每個列的值,行存儲只需要找到其中一個值,其余的值都在相鄰地方,所以此時行存儲查詢的速度更快。

  • 列存儲的特點
    因為每個字段的數據聚集存儲,在查詢只需要少數幾個字段的時候,能大大減少讀取的數據量;每個字段的數據類型一定是相同的,列式存儲可以針對性的設計更好的設計壓縮算法。
    TEXTFILE和SEQUENCEFILE的存儲格式都是基于行存儲的;
    ORC和PARQUET是基于列式存儲的。

  • TextFile格式

    默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。可結合Gzip、Bzip2使用,但使用Gzip這種方式,hive不會對數據進行切分,從而無法對數據進行并行操作
    #Orc格式
    Orc (Optimized Row Columnar)是Hive 0.11版里引入的新的存儲格式
    可以看到每個Orc文件由1個或多個stripe組成,每個stripe一般為HDFS的塊大小,每一個stripe包含多條記錄,這些記錄按照列進行獨立存儲,對應到Parquet中的row group的概念。每個Stripe里有三部分組成,分別是Index Data,Row Data,Stripe Footer:

  • Index Data:一個輕量級的index,默認是每隔1W行做一個索引。這里做的索引應該只是記錄某行的各字段在Row Data中的offset。

  • Row Data:存的是具體的數據,先取部分行,然后對這些行按列進行存儲。對每個列進行了編碼,分成多個Stream來存儲。

  • Stripe Footer:存的是各個Stream的類型,長度等信息。
    每個文件有一個File Footer,這里面存的是每個Stripe的行數,每個Column的數據類型信息等;每個文件的尾部是一個PostScript,這里面記錄了整個文件的壓縮類型以及FileFooter的長度信息等。在讀取文件時,會seek到文件尾部讀PostScript,從里面解析到File Footer長度,再讀FileFooter,從里面解析到各個Stripe信息,再讀各個Stripe,即從后往前讀。

  • Parquet格式

    Parquet文件是以二進制方式存儲的,所以是不可以直接讀取的,文件中包括該文件的數據和元數據,因此Parquet格式文件是自解析的。

  • 行組(Row Group):每一個行組包含一定的行數,在一個HDFS文件中至少存儲一個行組,類似于orc的stripe的概念。

  • 列塊(Column Chunk):在一個行組中每一列保存在一個列塊中,行組中的所有列連續的存儲在這個行組文件中。一個列塊中的值都是相同類型的,不同的列塊可能使用不同的算法進行壓縮。

  • 頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的單位,在同一個列塊的不同頁可能使用不同的編碼方式。
    通常情況下,在存儲Parquet數據的時候會按照Block大小設置行組的大小,由于一般情況下每一個Mapper任務處理數據的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行并行度。Parquet文件的格式如圖
    上圖展示了一個Parquet文件的內容,一個文件中可以存儲多個行組,文件的首位都是該文件的Magic Code,用于校驗它是否是一個Parquet文件,Footer length記錄了文件元數據的大小,通過該值和文件長度可以計算出元數據的偏移量,文件的元數據中包括每一個行組的元數據信息和該文件存儲數據的Schema信息。除了文件中每一個行組的元數據,每一頁的開始都會存儲該頁的元數據,在Parquet中,有三種類型的頁:數據頁、字典頁和索引頁。數據頁用于存儲當前行組中該列的值,字典頁存儲該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來存儲當前行組下該列的索引,目前Parquet中還不支持索引頁

  • 主流文件存儲格式對比實驗

    從存儲文件的壓縮比和查詢速度兩個角度對比。
    存儲文件的壓縮比測試

    TextFile

  • 創建表,存儲數據格式為TEXTFILE

  • create table log_text (
    track_time string,
    url string,
    session_id string,
    referer string,
    ip string,
    end_user_id string,
    city_id string
    )
    row format delimited fields terminated by '\t'
    stored as textfile ;
  • 向表中加載數據

  • hive (default)> load data local inpath '/opt/module/datas/log.data' into table log_text ;
  • 查看表中數據大小

  • hive (default)> dfs -du -h /user/hive/warehouse/log_text;

    18.1 M /user/hive/warehouse/log_text/log.data

    ORC

  • 創建表,存儲數據格式為ORC

  • create table log_orc(
    track_time string,
    url string,
    session_id string,
    referer string,
    ip string,
    end_user_id string,
    city_id string
    )
    row format delimited fields terminated by '\t'
    stored as orc ;
  • 向表中加載數據

  • hive (default)> insert into table log_orc select * from log_text ;
  • 查看表中數據大小

  • hive (default)> dfs -du -h /user/hive/warehouse/log_orc/ ;

    2.8 M /user/hive/warehouse/log_orc/000000_0

    Parquet

  • 創建表,存儲數據格式為parquet

  • create table log_parquet(
    track_time string,
    url string,
    session_id string,
    referer string,
    ip string,
    end_user_id string,
    city_id string
    )
    row format delimited fields terminated by '\t'
    stored as parquet ;
  • 向表中加載數據

  • hive (default)> insert into table log_parquet select * from log_text ;
  • 查看表中數據大小

  • hive (default)> dfs -du -h /user/hive/warehouse/log_parquet/ ;

    13.1 M /user/hive/warehouse/log_parquet/000000_0
    存儲文件的壓縮比總結:
    ORC > Parquet > textFile

    存儲文件的查詢速度測試

    TextFile

    hive (default)> select count(*) from log_text;
    _c0
    100000
    Time taken: 21.54 seconds, Fetched: 1 row(s)
    Time taken: 21.08 seconds, Fetched: 1 row(s)
    Time taken: 19.298 seconds, Fetched: 1 row(s)

    ORC

    hive (default)> select count(*) from log_orc;
    _c0
    100000
    Time taken: 20.867 seconds, Fetched: 1 row(s)
    Time taken: 22.667 seconds, Fetched: 1 row(s)
    Time taken: 18.36 seconds, Fetched: 1 row(s)

    Parquet

    hive (default)> select count(*) from log_parquet;
    _c0
    100000
    Time taken: 22.922 seconds, Fetched: 1 row(s)
    Time taken: 21.074 seconds, Fetched: 1 row(s)
    Time taken: 18.384 seconds, Fetched: 1 row(s)

    存儲文件的查詢速度總結:查詢速度相近。


    簡書:https://www.jianshu.com/u/0278602aea1d
    CSDN:https://blog.csdn.net/u012387141

    總結

    以上是生活随笔為你收集整理的hive 行转列和列转行的方法_Hive超详细存储的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。