在 Python 中读写 Parquet 文件
本文重点介绍如何在 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() 函数包含几个参数来控制不同的设置。
- data_page_size - 此参数调节列块中编码数据页的大致数量。 目前,1MB 是默认值。
- flavor - 这提供特定于 Apache Spark Parquet 消费者的兼容性设置,例如 spark。
- 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 文件的程序。
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
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 中进行多项选择。