讀取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