迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

在 Python 中读写 Parquet 文件

作者:迹忆客 最近更新:2023/04/26 浏览次数:

本文重点介绍如何在 Python 中编写和读取 parquet 文件。 这些类型的文件是一种按列存储数据的存储系统格式。

与 CSV 等基于行的文件格式相比,Parquet 是一种性能优化的文件格式。 在基于 Parquet 的文件系统上执行查询时,可以非常快速地将焦点放在所需数据上。


在 Python 中读取和写入 Parquet 文件的 Parquet 接口

Python 使用引擎写入数据帧和读取镶木地板文件。 本文将解释一些在数据库上写入 parquet 文件的引擎。

为了在数据分析系统中使用,Apache Parquet 项目提供了一种标准化的开源列式存储格式。 Apache Arrow 是用于从 Parquet 文件读取或写入数据的最佳内存传输层。

我们将了解在 Python 中读取 parquet 文件的两个 parquet 接口:pyarrow 和 fastparquet。

Python 中的 PyArrow 模块

Apache Arrow 或 PyArrow 是一个内存分析开发平台。 它有一个技术集合,可以让大数据系统快速存储、处理和传输数据。

此代码在 pyarrow 中与 Python 绑定,使得使用 Pandas 写入和读取镶木地板文件成为可能。

使用 pip 和 conda 安装 pyarrow 很容易。

对于 pip,使用命令:

$ pip install pyarrow

对于 conda,请使用此命令:

$ conda install -c conda-forge pyarrow

使用 Python 中的 PyArrow 模块将数据帧写入 Parquet 文件

要了解如何在 Python 中编写数据框和读取 parquet 文件,让我们在下面的程序中创建一个 Pandas 表。

需要四个导入:

  • pyarrow - 用于编写镶木地板产品。
  • numpy - 用于多维数组。
  • pandas - 用于创建数据框。
  • parquet - pyarrow 的一个子功能。

该程序创建了一个数据框 store1,其中包含整数、字符串和布尔值等多种类型的数据集。 索引列表设置为“abc”以按字母顺序排列行。

在变量 table1 中,使用语法 Table.from_pandas() 创建 Pandas 表。 打印此表以检查结果。

import pyarrow.parquet as pq
import numpy as np

import pandas as pd

import pyarrow as pa

store1 = pd.DataFrame({'first': [5, np.nan, -9],

                       'second': ['apple', 'samsung', 'mi'],

                       'third': [False, False, True]},

                      index=list('abc'))

table1 = pa.Table.from_pandas(store1)
print(table1)

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
second: string
third: bool
__index_level_0__: string
----
first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

现在,此数据使用 write_table 以 parquet 格式写入。 写入 parquet 文件时,write_table() 函数包含几个参数来控制不同的设置。

  1. data_page_size - 此参数调节列块中编码数据页的大致数量。 目前,1MB 是默认值。
  2. flavor - 这提供特定于 Apache Spark Parquet 消费者的兼容性设置,例如 spark。
  3. version - 这是适当的 Parquet 格式版本。 虽然 1.0 和更高的值保证与早期读者的兼容性,但 2.4 和更高的值支持更多的 Parquet 类型和编码。

在此程序中,write_table() 参数随表 table1 和用于写入 parquet parquet.txt 的本机文件一起提供。

可以在不使用字符串的情况下指示文件的来源。 以下任何一项都是可能的:

  • 作为字符串的文件路径
  • 本机 PyArrow 文件
  • Python 中的文件对象

要读取此表,请使用 read_table() 函数。 变量 table2 用于将表加载到它上面。

最后,使用 table2.to_pandas() 将此镶木地板文件转换为 Pandas 数据帧并打印。

pq.write_table(table1, 'sample_file.parquet')

table2 = pq.read_table('sample_file.parquet')

table2.to_pandas()

print("\n", table2)

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"

 pyarrow.Table
first: double
second: string
third: bool

__index_level_0__: string
----

first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

Parquet 文件通常是巨大的数据文件,用 Python 读取 parquet 文件需要很长时间才能加载。 因此,可以传递特定的列来快速读取数据,而不是加载整个文件:

在变量table3中,使用pq.read_table函数写入数据。 在参数括号内,提供了两列:第一列和第三列。

table3 = pq.read_table('parquet.txt', columns=['first', 'third'])
print(table3)

输出将显示选定的列。

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
third: bool
----
first: [[5,null,-9]]
third: [[false,false,true]]

Process finished with exit code 0

当使用 Pandas 数据框作为源从文件中读取列的子集时,我们使用 read_pandas 来保留任何额外的索引列数据:

table4 = pq.read_pandas('parquet.txt', columns=['second']).to_pandas()
print(table4)

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
       second
a    apple
b  samsung
c       mi

Process finished with exit code 0

字符串文件路径或 NativeFile 实例(尤其是内存映射)在读取时的性能优于 Python 文件对象,后者通常具有最差的读取速度。

当使用 pa.Table.from_pandas 将表转换为 Arrow 表以维护索引(行标签)的跟踪时,会自动创建一个或多个特殊列。 如果索引没有价值,可以通过preserve index=False选择省略,因为存储索引需要更多的存储空间。

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

store = pd.DataFrame({'first': [5, np.nan, -9],

                      'second': ['apple', 'samsung', 'mi'],

                      'third': [False, False, True]},

                     index=list('abc'))

print(store)

table = pa.Table.from_pandas(store, preserve_index=False)
pq.write_table(table, 'sample_file.parquet')
t = pq.read_table('sample_file.parquet')

print("\n", t.to_pandas())

显示的 parquet 文件已删除其索引。

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   first   second  third
a    5.0    apple  False
b    NaN  samsung  False
c   -9.0       mi   True

    first   second  third
0    5.0    apple  False
1    NaN  samsung  False
2   -9.0       mi   True

Process finished with exit code 0

在 Python 中使用 PyArrow 模块读取 Parquet 文件的元数据

除了从文件中读取数据外,read_table 方法使用的 ParquetFile 类还提供其他功能,例如读取元数据。

import pyarrow.parquet as pq

parquet_file = pq.ParquetFile('example.parquet')
print(parquet_file.metadata)

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
<pyarrow._parquet.FileMetaData object at 0x000001DADCBDCA90>
  created_by: parquet-cpp-arrow version 9.0.0
  num_columns: 4
  num_rows: 3
  num_row_groups: 1
  format_version: 2.6
  serialized_size: 2580

Process finished with exit code 0

在 Python 中使用 Fastparquet 引擎将数据写入 Parquet 文件

它是 parquet 文件格式的 Python 接口。

该程序使用 fastparquet 在 parquet 文件上写入。 创建的数据框存储包含两列:student 和 marks。

使用 dataframe.to_parquet() 函数将数据框写入 parquet 文件 sample.parquet。

引擎选择为 fastparquet,但也可以设置为 pyarrow。

import pandas as pd

store = pd.DataFrame({
    'student': ['Michael', 'Jackson', 'N', 'John', 'Cena'],
    'marks': [20, 10, 22, 21, 22],
})

print(store)
store.to_parquet('sample.parquet', engine='fastparquet')

输出:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

当数据写入 parquet 文件时,让我们读取该文件。


在 Python 中使用 Fastparquet 引擎读取 Parquet 文件

使用 pd.read_parquet 函数读取 parquet 文件,将引擎设置为 fastparquet 并将其存储在变量 df 中。 然后打印结果。

df = pd.read_parquet('sample.parquet', engine='fastparquet')
print(df)

输出:

C:\python38\python.exe "C:/Users/Win 10/PycharmProjects/read_parquet/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

总结

本文介绍了如何在 Python 中读取 parquet 文件。 程序示例演示了使用 pyarrow 和 fastparquet 读取镶木地板文件。

读者应该能够轻松地创建在 Python 中读取 parquet 文件的程序。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便