最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

相關術語

  • 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ù)的查詢

從層次結構上看,文件由一個或多個行組組成,行組的每列恰好包含一個列塊,列塊包含一頁或多頁

結構圖如下

文件格式如下

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,Blockoffsetsize,Column Chunkoffsetsize等所有重要的元數(shù)據(jù)
  • 承擔了整個文件入口的職責,讀取Parquet文件的第一步就是讀取Footer信息,轉(zhuǎn)換成元數(shù)據(jù)之后,再根據(jù)這些元數(shù)據(jù)跳轉(zhuǎn)到對應的blockcolumn,讀取真正所要的數(shù)據(jù)

Index

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

謂詞下推是一種優(yōu)化查詢性能的技術,簡單地來說就是把查詢條件發(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)容,更多關于Apache Arrow Parquet存儲的資料請關注腳本之家其它相關文章!

相關文章

  • Java程序員必須知道的5個JVM命令行標志

    Java程序員必須知道的5個JVM命令行標志

    這篇文章主要介紹了每個Java程序員必須知道的5個JVM命令行標志,需要的朋友可以參考下
    2015-03-03
  • JVM角度調(diào)試優(yōu)化MyEclipse

    JVM角度調(diào)試優(yōu)化MyEclipse

    這篇文章主要介紹了從JVM角度對MyEclipse進行調(diào)試優(yōu)化,為大家分析調(diào)試優(yōu)化MyEclipse的步驟,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 聊一聊Java反射

    聊一聊Java反射

    工作中哪些地方比較容易用到反射,這篇文章就為大家介紹了工作中常用到的Java反射,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 詳細講解Java抽象類示例

    詳細講解Java抽象類示例

    這篇文章主要介紹了 Java抽象類示例,抽象類通常用于定義一些公共的方法和屬性,但是這些方法沒有具體的實現(xiàn),需要的朋友可以參考下
    2023-05-05
  • SpringBoot 中使用RabbtiMq?詳解

    SpringBoot 中使用RabbtiMq?詳解

    這篇文章主要介紹了SpringBoot 中使用RabbtiMq詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價價值,需要的朋友可以參考一下
    2022-07-07
  • SpringMVC集成Swagger實例代碼

    SpringMVC集成Swagger實例代碼

    本篇文章主要介紹了SpringMVC集成Swagger實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • springboot 日志彩色消失的2種解決方案

    springboot 日志彩色消失的2種解決方案

    這篇文章主要介紹了springboot 日志彩色消失的2種解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java獲取指定字符串出現(xiàn)次數(shù)的方法

    Java獲取指定字符串出現(xiàn)次數(shù)的方法

    這篇文章主要為大家詳細介紹了Java獲取指定字符串出現(xiàn)次數(shù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 淺談JAVA版本號的問題 Java版本號與JDk版本

    淺談JAVA版本號的問題 Java版本號與JDk版本

    這篇文章主要介紹了淺談JAVA版本號的問題 Java版本號與JDk版本,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring boot項目redisTemplate實現(xiàn)輕量級消息隊列的方法

    Spring boot項目redisTemplate實現(xiàn)輕量級消息隊列的方法

    這篇文章主要給大家介紹了關于Spring boot項目redisTemplate實現(xiàn)輕量級消息隊列的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04

最新評論

仙游县| 奉节县| 开江县| 闽清县| 南康市| 方城县| 丹凤县| 高雄县| 鄂托克旗| 花莲市| 临漳县| 扎赉特旗| 社旗县| 绥棱县| 务川| 夹江县| 双峰县| 怀集县| 东明县| 西峡县| 涡阳县| 北辰区| 隆子县| 仪陇县| 宝山区| 琼中| 西安市| 文昌市| 金秀| 邵阳市| 尚义县| 江安县| 宕昌县| 繁峙县| 永善县| 深水埗区| 镇远县| 吉林省| 新沂市| 旌德县| 长乐市|