数据格式_pyarrow_Arrow

列式存储格式

 列式存储格式 (Arrow Columnar Format)
     arrow/format/Schema.fbs  定义了 Arrow 列式格式支持的内置数据类型
        Bitmap 就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。
 JSON 协议性能低:虽然可读,但序列化速度远低于 Protobuf 或 Thrift Binary

数据-消息和格式

    定义了 内存中表示tabular data的格式
     Arrow还定义了IPC格式,序列化内存中的数据,进行网络传输,或者把数据以文件的方式持久化
列式存储和内存格式(Arrow format) 
 Table. 
      这是后期为了查询引擎/Flight SQL 提供的一种在RecordBatch/ChunkedArray基础之上的一个内存结构
	  Arrow Flight SQL 是一种使用 Arrow 内存格式和Flight RPC框架与 SQL 数据库交互的协议。
	   data consisting of an ordered collection of chunked arrays
 RecordBatch 和 Schema. 
    RecordBatch 是一个或者多个 不同DataType 但是相同长度 Array 的集合,
	    RecordBatch中的每个Array代表一个列,而RecordBatch中的行数由Array的长度确定
		RecordBatch提供了一种高效的方式来处理和传输数据集,支持批处理操作和列式访问模式。Record Batch也是序列化的基本单元
    Schema 则是 RecordBatch 用来管理这一些Array类型的结构
      ChunkArray 则是统一管理相同类型但是不同来源的 Array, 同一个Chunk内部的不同Array中存储数据的Buffer 在内存上是不连续的.
	DictionayBatch  
 DataType 和 Array  
	DataType可以理解为数据的描述信息, Array则直接保存列式的数据
	类型系统 Scalar Types  Nested Types  Dictionary Type  UDT(User Defined Types)
	     DataType 继承的各种数据类型已经按照分类划分好了, 每一种数据类型对应的 Array数据部分的存储内存布局则是由 DataTypeLayout 决定
		     FIXED_WIDTH 单值定长类型,有一个buffer保存;  VARIABLE_WIDTH 变长类型, 需要两个buffer, 一个保存值的len, 另一个保存原值.
		     BITMAP, bitmap buffer, 保存是否有空值 ALWAYS_NULL 全为空
			 NULL值是用bitmap来表示,bit 0 表示NULL,bit 1表示非NULL值
		 Array的底层管理了一个或者多个Buffer, 选择的Buffer布局是根据运行时前面描述的 DataType::layout() 
		    数据管理结构是 ArrayData, 对于数据类型都会有
			   对应的 Array(比如 StringArray, NumericArray – 处理数值类型的数据存储等)
			   以及 ArrayBuilder.
			内存中表示数据的最基本单元是array,它代表了一连串长度已知、类型相同的数据   
 Buffer. 数据内存格式存储实际数据的最底层数据结构
    Buffer 本身并不提供内存对齐的能力, arrow 通过MemoryManager来管理buffer 占用的内存区域
    ResizableBuffer 和 MutableBuffer 用来对buffer 指向的数据或者存储空间进行操作.		

消息

 消息格式
    消息格式是一种用于在不同进程间高效传输数据的序列化格式
FlatBuffers 消息表
   消息涉及到了传输--传输有序列化和反序列化--数据交换 IPC
    arrow定义了一个传输协议,能把多个record batch序列化成一个二进制的字节流,并且把这些字节流反序列化成record batch
        字节流由一连串的message组成,arrow定义了多种message type,
          主要是schema message和record batch message。
    	  一个schema message和多个record batch message就能完整的表示一个结果集(或者一个表)
    消息数据--pyarrow.ipc.Message
       
    典型的消息流通常由一个 Schema 消息开始,后跟一些 DictionaryBatch 和 RecordBatch 消息。
        首个 Schema 消息不包含任何数据缓冲区,仅包含关于消息的元数据信息,例如类型信息	
		
使用了 Google’s Flatbuffers project for metadata serialization		

文件格式

    流和文件格式中的数据组件表示为封装 消息
       Schema  RecordBatch  DictionaryBatch  Tensor	
  根据这些message,arrow定义了IPC Streaming Format
  	Encapsulated message format
    IPC Streaming format 
    IPC File Format  	   
   
<magic number "ARROW1">   

Columnar 结构将数据按列存储在连续的内存区域中,而不是按行存储

Meta 正在引入 Velox,这是一个开源的统一执行引擎(unified execution engine)
  计算引擎乍一看似乎各不相同,但它们都由一组类似的
    逻辑组件组成:语言前端
	              、中间表示(intermediate representation、IR)
				  、优化器
				  、执行运行时(execution runtime)和执行引擎(execution engine)
    Velox 提供了实现执行引擎所需的构建块 :一个开源的统一执行引擎

python/pyarrow

1.`pandas`库,它提供了一个便捷的函数`read_parquet
2 pyarrow
  import pyarrow as pa
  import pyarrow.parquet as pq

数据对象 
   pyarrow.dataset 模块创建数据集对象
   pyarrow.Table 对象转换
      pyarrow的 Table对象
	  
	分块数组(chunked arrays) 


处理其他格式  Python 接口是构建在 C++ 库之上的
  >>> import pyarrow as pa
  >>> import pyarrow.csv
  >>> table = pa.csv.read_csv('sample_data/train.csv')	

数据类型

 pyarrow.Array  pyarrow.Table
 pyarrow.RecordBatch 
 pyarrow.DataType  pyarrow.Schema
 数据类型
    array Arrow 中的数组是统一类型的数据集合	
         days = pa.array([1, 12, 17, 23, 28], type=pa.int8())
         years = pa.array([1990, 2000, 1995, 2000, 1995], type=pa.int16())	
    Table 多个数组组合在表中以形成表格数据中的列	
        birthdays_table = pa.table([days,  years], names=["days",   "years"]) 	
import pyarrow.dataset as ds
    dataset  
	    pyarrow.dataset处理大数据的 API  partitioning=ds.partitioning

pa.RecordBatch.from_arrays
    pa.record_batch

元数据
    Field 类型是一个类型加上名称和可选的用户定义元数据	
	pa.struct	

pyarrow.Buffer

parquet 
   import pyarrow.parquet as pq	
   pq.write_table
   pq.read_table

参考

  https://github.com/apache/arrow/blob/main/format/Schema.fbs
posted @ 2025-05-30 17:33  辰令  阅读(97)  评论(0)    收藏  举报