parquet文件的操作记录

读取parquet文件的两种方法
直接读取为pandas的dataframe对象,但是速度慢。

def read_parquet_to_dataframe(file_path):
    df=pd.read_parquet(file_path)
    print(df)

所以改为读取为生成器的方式,提高效率,减少内存空间消耗。


def read_parquet_iter_batches():
    parquet_file = pq.ParquetFile(small_parquet_file)
    data_list = []
    for batch in parquet_file.iter_batches():
        column_names = batch.schema.names
        batch_bf = zip(*batch.columns)
        for row in batch_bf:
            item = {}
            for index, value in enumerate(row):
                column_name =column_names[index]
                if column_name.startswith("__"):
                    continue
                item[column_name] = value.as_py()
            print(item)

获取parquet文件的元信息

import pyarrow.parquet as pq

parquet_file = "36152ae88916cad7eecc74cafa5c6413.parquet"
schema=pq.ParquetFile(parquet_file).schema

可以查看schema,我们可以看到每个字段的名称以及数据的类型。

<pyarrow._parquet.ParquetSchema object at 0x138bcc608>
required group field_id=-1 schema {
  optional binary field_id=-1 URL (String);
  optional binary field_id=-1 TEXT (String);
  optional double field_id=-1 WIDTH;
  optional double field_id=-1 HEIGHT;
  optional double field_id=-1 similarity;
  optional int64 field_id=-1 hash;
  optional double field_id=-1 punsafe;
  optional double field_id=-1 pwatermark;
  optional double field_id=-1 aesthetic;
  optional binary field_id=-1 BUFFER;
}

['URL', 'TEXT', 'WIDTH', 'HEIGHT', 'similarity', 'hash', 'punsafe', 'pwatermark', 'aesthetic', 'BUFFER']

或者下面的代码

schema = pq.ParquetFile(small_parquet_file).schema_arrow
print(schema.names)
print(schema.types)

在生成Parquet文件时,通常会先创建一个包含文件元数据的几百KB的文件,然后逐步将数据写入到这个文件中,直到生成完整的Parquet文件。这是因为Parquet文件格式是一种高度压缩的列式存储格式,它要求先对数据进行一些预处理和压缩,才能生成最终的Parquet文件。为了判断文件是否生成完毕,可以通过下面的代码

metadata = pq.ParquetFile(small_parquet_file).metadata
print(metadata)

可以得到下面这些信息

<pyarrow._parquet.FileMetaData object at 0x145220990>
  created_by: parquet-cpp-arrow version 6.0.1
  num_columns: 10
  num_rows: 40000
  num_row_groups: 1
  format_version: 1.0
  serialized_size: 5979

统计当前文件下parquet文件数据总行数

from pathlib import Path

import pyarrow.parquet as pq

file = Path("source/parquet_files")
count = 0
for each in file.glob("*.parquet"):
    pqobj = pq.ParquetFile(each)
    schema = pqobj.schema_arrow
    metadata = pqobj.metadata
    num_rows = metadata.num_rows
    count += num_rows
    print(schema)
    print(metadata)

print("total:", count)
posted @ 2023-03-16 14:15  公众号python学习开发  阅读(447)  评论(0编辑  收藏  举报