格式分类
存储格式 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 作为内存模型,这使得它在处理数据时能够更高效地利用内存
数据格式
HDF5 binary data format HDF5格式适用于大量科学数据的高效存储,支持元数据和压缩 库 h5py
pyarrow
import pyarrow as pa
pa.array
pa.record_batch
pyarrow.table()
pa.Table.from_arrays([n_legs, animals], names=names)
pa.Table.from_batches([batch])
pa.Table.from_pandas(df)
pa.Table.from_pydict(pydict) from_pydict from_pylist
代码示例
import pyarrow as pa
import pyarrow.parquet as pq
# 创建一个 Arrow Table
table = pa.table(
{"observation.state" : [[25.0, 30.0, 35.0]],
"observation.action": [[25.0, 30.0, 35.0]],
"timestamp" : [0.0],
"annotation.human.action.task_description": [30],
"task_index" : [0],
"annotation.human.validity": [1],
"episode_index" : [1],
"index" : [1],
"next.reward" : [0.0],
"next.done" : [False]
})
# 保存为 Parquet 文件
pq.write_table(table, "data_arrow.parquet")
引擎
使用pandas配合pyarrow引擎读写文件,适用于小规模数据;
面对大规模数据时采用pyarrow模块实现按列或分块读取--pyarrow.parquet 模块,它支持按列读取、分块读取等高级功能
选择合适的引擎:
pyarrow 适用于高性能数据操作,如 Spark 兼容。
fastparquet 更适用于 Dask 生态,适合分布式计算。
参考
存了50TB,巨能装的Pyarrow + parquet方案 https://zhuanlan.zhihu.com/p/675767714
https://pola-rs.github.io/polars-book-cn/user-guide/introduction.html
https://arrow.apache.org/docs/python/generated/pyarrow.Table.html