数据_数据格式-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
分类:
数据存储和消息系统
, Python_Java_数据开发
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2024-01-10 数据库_DuckDB_数据库应用示例