亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Apache?Arrow?Parquet存儲與使用

 更新時間:2023年08月30日 09:14:55   作者:龔正陽  
這篇文章主要為大家介紹了Apache?Arrow?Parquet存儲與使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

簡介

Parquet是一種高效的列式存儲格式,廣泛用于大數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)倉庫和數(shù)據(jù)管理工具中,旨在提高數(shù)據(jù)分析的性能和效率,能夠更好地支持數(shù)據(jù)壓縮和列式查詢,同時兼顧讀寫速度和數(shù)據(jù)大小

初衷

為了讓 Hadoop 生態(tài)系統(tǒng)中的任何項目都能利用壓縮、高效的列式數(shù)據(jù)表示的優(yōu)勢

技術(shù)與原理

基于列存儲和壓縮技術(shù),每一列的數(shù)據(jù)通過一系列壓縮算法進行壓縮,然后存儲到文件系統(tǒng)中,這種方式能夠避免存儲冗余數(shù)據(jù),并且能夠使查詢只涉及到所需的列,從而大大提高查詢效率

相關(guān)術(shù)語

  • Blockhdfs Block):hdfs中的數(shù)據(jù)塊
  • Filehdfs 文件,包含文件的元數(shù)據(jù),不需要包含實際的數(shù)據(jù)
  • Row group/行組:將數(shù)據(jù)水平劃分為Row group
  • Column chunk:特定列的數(shù)據(jù)塊,它們位于特定的行組中,并保證在文件中是連續(xù)的
  • Page:列塊被分為頁,頁面在概念上是一個不可分割的單元(就壓縮和編碼而言),列塊中可以有多種交錯的頁面類型,Page為了讓數(shù)據(jù)讀取的粒度足夠小,便于單條數(shù)據(jù)或小批量數(shù)據(jù)的查詢

從層次結(jié)構(gòu)上看,文件由一個或多個行組組成,行組的每列恰好包含一個列塊,列塊包含一頁或多頁

結(jié)構(gòu)圖如下

文件格式如下

4-byte magic number "PAR1"
<Column 1 Chunk 1 + Column Metadata>
<Column 2 Chunk 1 + Column Metadata>
...
<Column N Chunk 1 + Column Metadata>
<Column 1 Chunk 2 + Column Metadata>
<Column 2 Chunk 2 + Column Metadata>
...
<Column N Chunk 2 + Column Metadata>
...
<Column 1 Chunk M + Column Metadata>
<Column 2 Chunk M + Column Metadata>
...
<Column N Chunk M + Column Metadata>
File Metadata
4-byte length in bytes of file metadata
4-byte magic number "PAR1"

Header

Header的內(nèi)容很少,只有4個字節(jié),本質(zhì)是一個magic number,用來指示文件類型

PAR1:普通的Parquet文件

PARE: 加密過的Parquet文件

File Body

實際存儲數(shù)據(jù),包含Column ChunkColumn Metadata

Footer

  • 包含了諸如schema,BlockoffsetsizeColumn Chunkoffsetsize等所有重要的元數(shù)據(jù)
  • 承擔(dān)了整個文件入口的職責(zé),讀取Parquet文件的第一步就是讀取Footer信息,轉(zhuǎn)換成元數(shù)據(jù)之后,再根據(jù)這些元數(shù)據(jù)跳轉(zhuǎn)到對應(yīng)的blockcolumn,讀取真正所要的數(shù)據(jù)

Index

IndexParquet文件的索引塊,主要為了支持謂詞下推(Predicate Pushdown)功能

謂詞下推是一種優(yōu)化查詢性能的技術(shù),簡單地來說就是把查詢條件發(fā)給存儲層,讓存儲層可以做初步的過濾,把肯定不滿足查詢條件的數(shù)據(jù)排除掉,從而減少數(shù)據(jù)的讀取和傳輸量

Parquet索引類型

  • Max-MinMax-Min索引是對每個Page都記錄它所含數(shù)據(jù)的最大值和最小值,這樣某個Page是否不滿足查詢條件就可以通過這個Pagemaxmin值來判斷
  • BloomFilter索引: 針對value比較稀疏,max-min范圍比較大的列,用Max-Min索引的效果就不太好,BloomFilter可以克服這一點,同時也可以用于單條數(shù)據(jù)的查詢

rust讀寫Parquet文件

依賴項目

https://github.com/apache/arrow-r

修改Cargo.toml如下

[dependencies]
parquet = "46.0.0"
parquet_derive = "46.0.0"

修改main.rs

use std::convert::TryFrom;
use std::{fs, path::Path};
use parquet::file::reader::SerializedFileReader;
use parquet::file::writer::SerializedFileWriter;
use parquet::record::RecordWriter;
use parquet_derive::ParquetRecordWriter;
const PARQUET_FILEPATH: &str = "./target/sample.parquet";
#[derive(ParquetRecordWriter)]
struct ACompleteRecord<'a> {
    pub a_bool: bool,
    pub a_str: &'a str,
}
fn write() {
    let path = Path::new(PARQUET_FILEPATH);
    let file = fs::File::create(path).unwrap();
    let samples = vec![
        ACompleteRecord {
            a_bool: true,
            a_str: "I'm true",
        },
        ACompleteRecord {
            a_bool: false,
            a_str: "I'm false",
        },
    ];
    let schema = samples.as_slice().schema().unwrap();
    let mut writer = SerializedFileWriter::new(file, schema, Default::default()).unwrap();
    let mut row_group = writer.next_row_group().unwrap();
    samples
        .as_slice()
        .write_to_row_group(&mut row_group)
        .unwrap();
    row_group.close().unwrap();
    writer.close().unwrap();
}
fn read() {
    let rows = [PARQUET_FILEPATH]
        .iter()
        .map(|p| SerializedFileReader::try_from(*p).unwrap())
        .flat_map(|r| r.into_iter());
    for row in rows {
        println!("{}", row.unwrap());
    }
}
fn main() {
    write();
    read();
}

運行

$ cargo run   
   Compiling temp v0.1.0 (/home/gong/rust-work/temp)
    Finished dev [unoptimized + debuginfo] target(s) in 2.26s
     Running `target/debug/temp`
{a_bool: true, a_str: "I'm true"}
{a_bool: false, a_str: "I'm false"}

查看parquet文件

$ cat target/sample.parquet
PAR1,X%a_bool44<X22I'm true     I'm false,I'm true      I'm false
                                                                 5a_str??&?&?I'm true   I'm false       I'm falsI'm tru4?V<H
     rust_schema%a_bool
                       %a_str%L,&<%a_bool44<X??"&?
                                                  5a_str??&?&?I'm true  I'm false??@??(parquet-rs version 46.0.0?PAR1%

閱讀參考

Apache parquet document

詳解Parquet文件格式原理

以上就是Apache Arrow Parquet存儲與使用的詳細內(nèi)容,更多關(guān)于Apache Arrow Parquet存儲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用@CacheEvict清除指定下所有緩存

    使用@CacheEvict清除指定下所有緩存

    這篇文章主要介紹了使用@CacheEvict清除指定下所有緩存,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java集合系列之LinkedHashMap源碼分析

    Java集合系列之LinkedHashMap源碼分析

    這篇文章主要為大家詳細介紹了Java集合系列之LinkedHashMap源碼分析,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java實現(xiàn)List去重的幾種方法總結(jié)

    Java實現(xiàn)List去重的幾種方法總結(jié)

    這篇文章主要為大家詳細介紹了Java中List去重的幾種常用方法總結(jié),文中的示例代碼講解詳細,具有一定的學(xué)習(xí)和參考價值,需要的小伙伴可以了解一下
    2023-09-09
  • Java8新特性之接口中的默認方法和靜態(tài)方法詳解

    Java8新特性之接口中的默認方法和靜態(tài)方法詳解

    今天帶大家學(xué)習(xí)的是Java8新特性的相關(guān)知識,文章圍繞著Java接口中的默認方法和靜態(tài)方法展開,文中有非常詳細的的代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)常見幾大排序梳理

    Java數(shù)據(jù)結(jié)構(gòu)常見幾大排序梳理

    Java常見的排序算法有:直接插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序等。本文詳解介紹它們的實現(xiàn)以及圖解,需要的可以參考一下
    2022-03-03
  • Java知識梳理之泛型用法詳解

    Java知識梳理之泛型用法詳解

    從JDK?5.0以后,Java引入了“參數(shù)化類型(Parameterized?type)”的概念,允許我們在創(chuàng)建集合時再指定集合元素的類型。本文就來和大家深入聊聊Java泛型的使用
    2022-08-08
  • spring boot 監(jiān)控處理方案實例詳解

    spring boot 監(jiān)控處理方案實例詳解

    這篇文章主要介紹了spring boot 監(jiān)控處理方案的相關(guān)資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • JAVA使用動態(tài)代理對象進行敏感字過濾代碼實例

    JAVA使用動態(tài)代理對象進行敏感字過濾代碼實例

    這篇文章主要介紹了JAVA使用動態(tài)代理對象進行敏感字過濾代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 淺談spring的重試機制無效@Retryable@EnableRetry

    淺談spring的重試機制無效@Retryable@EnableRetry

    這篇文章主要介紹了淺談spring的重試機制無效@Retryable@EnableRetry,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • RabbitMQ消息確認機制剖析

    RabbitMQ消息確認機制剖析

    這篇文章主要為大家介紹了RabbitMQ消息確認機制剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論