数据_数据格式-parquet文件读写示例

格式分类

    存储格式 vs 运行时内存格式 vs 消息传递格式	
	
	   1.存储格式
	   2. 一旦从存储格式中读取数据,你需要将数据转换为另一种表示形式,以便对其进行操作和计算。
		   这种表示形式称为内存中的运行时表示或格式 字节对齐和随机读取与顺序读取的差异
	       像 Arrow 和 FlatBuffers 这样的格式,其进程间表示与内存表示是相同的
	   3.	消息传递格式,比如 Protobuf、FlatBuffers 和 JSON 
             Protobuf 的官方文档指出其最适合的消息大小是小于 1 MB		   
    关注点: 数据大小-序列化/反序列化速度-易用性(可读性和兼容性)
            存储成本/ 输入/输出(I/O)成本和数据检索的带宽成本以及网络延迟
数据的使用方式不同,在优化读取与优化写入之间通常会存在取舍
    Parquet 和 ORC 采用列式存储形式,通常比 CSV 和 Avro 更具压缩性 

Apache Arrow 生态系统

 Arrow、Parquet 和 Flight
    arrow flight 协议
	  Arrow Flight SQL 是一种使用 Arrow 内存格式和 Flight RPC 框架与 SQL 数据库交互的协议
         RPC(Remote Procedure Call,远程过程调用  常采用二进制协议(如Protocol Buffers)和高性能的网络通信技术(如HTTP/2、TCP)来提升性能和效率
		    gRPC 是谷歌流行的基于 HTTP/2 的通用 RPC 库和框架
		    Flight 中,与数据相关的 Protobuf 主要类型被称为 FlightData	
    Streams 
 Parquet 文件格式是自解析的,采用 thrift 格式定义的文件 schema 以及其他元数据信息一起存储在文件的末尾 	   

读取

 单个文件    pq.read_table
      写入: write_table()  ParquetWriter
 多个文件 Multiple Parquet files constitute a Parquet dataset.
    读取   pq.ParquetDataset
	写入: pq.write_to_dataset(table, root_path='dataset_name',partition_cols=['year', 'month'])
  import pyarrow.dataset as ds 
   
 ##读取云空间数据 
 from pyarrow import fs
  s3  = fs.S3FileSystem(region="us-east-2")
  dataset = ds.dataset("voltrondata-labs-datasets/nyc-taxi/", filesystem=s3)	 

pq.ParquetFile

 metadata 	

代码示例

import os,json
import pandas  as pd 
import pyarrow as pa 
import pyarrow.parquet as pq 
import pyarrow.dataset as ds 


def get_parquet_schema():
    ### 1.静态生成parquet 的数据模式schema
	atts =[pa.field("grade",pa.int64()),
	       pa.field("class",pa.int64()),
	       ]
	pa_json_schema = pa.schema(
	    [
		  pa.field("number",pa.int64()),
		  pa.field("name",pa.string),
		  pa.field("info",pa.struct(atts)),
		  pa.field("subject",pa.list_(pa.string()))
		],
		matadata={"grade":"students grade"}
	
       	)
def get_json_to_parquet(json_file_path.pa_json_schema_dat):
    ####2 创建包含切套列表的数据
	with open(json_file_path,mode="r",encoding="utf8") as js_file:
	    js_file_content = json.load(js_file)
		label = js_file_content["infos"]
		###3.创建数据
		batch_dat = pa.Table.from_pylist(
		           label, schema=pa_json_schema_dat)
	return batch_dat
	

def clips_json_tp_parquet(root_dir,match_dir="school"):
    for dirpath,dirnames,filenames in sorted(os.walk(root_dir)):
	pa_schema = get_parquet_schema()
	if len(dirnames)==0 and dirpath.endswith(match_dir):
	    result_tables = None
		gt_student_json = [std_file for std_file in sorted(os.listdir(dir_path)) if std_file.endswith("json")]
		for gt_student  in gt_student_json:
            gt_file_path  = os.path.join(dirpath,gt_student)
            parquet_tabels = get_json_to_parquet(gt_file_path,pa_schema)
            if result_tables is None:
                result_tables = parquet_tabels
		    ###拼接表
            else:
                result_tables =m pa.concat_tables([result_tables,parquet_tabels])	
		out_file = os.path.join(root_dir,"test.parquet")
		### 保存为parquet格式文件
        pq.write_table(result_tables,out_file)	

if __name__ =="__main__":
    root_js_dir = "/data/test"
    clips_json_tp_parquet(root_js_dir)	

Parquet文件和Arrow格式

 Hugging Face数据集的角度出发:Parquet格式能够高效地存储结构化和半结构化数据,特别适合大规模数据集的存储和查询
 Arrow 是一个跨语言的数据交换格式,主要用于内存中的数据存储和数据传输
 Parquet格式 是一种用于数据持久化存储的格式,而 Arrow格式 是一种高效的内存存储和传输格式
   Hugging Face  datasets库会将这些 Parquet文件解码成 Arrow格式,并将数据加载到内存	 


pandas来读取该Parquet文件
    Pandas 使用 PyArrow 将Parquet数据加载到内存,但会将数据复制到了Pandas的内存空间中
	Polars 读取Parquet时,Polars会直接复制进Arrow的内存空间,且始终使用这块内存

Python 数据分析

Polars使用 Apache Arrow 作为内存模型,这使得它在处理数据时能够更高效地利用内存	

参考

 存了50TB,巨能装的Pyarrow + parquet方案 https://zhuanlan.zhihu.com/p/675767714
 https://pola-rs.github.io/polars-book-cn/user-guide/introduction.html
posted @   辰令  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2024-01-10 数据库_DuckDB_数据库应用示例
点击右上角即可分享
微信分享提示