The read_parquet
函数于Pandas允许您将 Parquet 文件读入数据框.
它提供了从本地文件路径或 URL 读取 Parquet 文件的功能。它的多功能性还不止于此。该函数提供了几个额外的选项来加载和处理文件中的数据。
什么是 Parquet 文件?
Parquet,也称为 Apache Parquet,是一种面向列的数据存储格式,针对大型数据集进行了优化 - 它可以最大限度地减少文件大小,同时最大限度地提高查询数据时的效率。
Parquet 还被设计为一种自描述文件格式。模式嵌入在数据中,这使得数据的读写更加灵活和健壮。
Parquet 文件不是纯文本,它们是二进制文件。
Parquet 文件的优点之一是它们可以包含许多不同类型的数据,包括复杂的嵌套结构,并且可以有效地处理数据压缩和编码方案。
现在,让我们创建一个 Parquet 文件作为本教程中使用的示例数据:
import pandas as pd
data = {
'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [28, 24, 35, 32],
'City': ['New York', 'Paris', 'Berlin', 'London']
}
df = pd.DataFrame(data)
df.to_parquet('people.parquet')
上面的代码创建一个数据框来自示例数据,然后使用以下命令将 DataFrame 转换为名为“people.parquet”的 Parquet 文件to_parquet
功能。
语法和参数
使用的语法read_parquet
函数如下:
pandas.read_parquet(path, engine='auto', columns=None, **kwargs)
现在我们来分解一下这些参数:
-
path:表示从中读取 parquet 文件的文件路径或 URL 的字符串。本地和远程(通过有效的 URL 方案)文件都可以访问。
-
engine:用于读取文件的引擎。选项为“auto”、“pyarrow”或“fastparquet”。 “auto”让 Pandas 决定使用哪个引擎。
-
columns:如果不是“无”,则只会从文件中读取这些列。如果您只需要特定的列,这可以显着优化读取过程。
-
kwargs:传递给引擎的额外选项。有关这些选项的更多信息,请查看相应引擎的文档。
例如,PyArrow 支持其他选项,例如memory_map
and buffer_size
.
The memory_map
option是一个布尔值,指定是否使用mmap,一种内存映射文件读取的方法,在某些场景下可以提高性能。
The buffer_size
设置读取缓冲区的大小,如果使用得当,它也会影响读取性能。
The read_parquet
函数返回一个DataFrame对象,其中包含从文件中读取的数据。
如何使用 Pandas 读取 Parquet 文件
您可以使用以下命令读取 Parquet 文件read_parquet
函数通过将镶木地板文件传递给函数,如下所示:
import pandas as pd
df = pd.read_parquet('people.parquet')
print(df)
Output:
Name Age City
0 John 28 New York
1 Anna 24 Paris
2 Peter 35 Berlin
3 Linda 32 London
在此示例中,该函数读取文件并返回一个 DataFrame。
索引 (0, 1, 2, 3) 由 Pandas 自动生成。
了解不同的发动机选项
正如我们之前讨论的,read_parquet
函数支持两种引擎:PyArrow 和 fastparquet。
要使用它们,您需要先安装它们:
pip install fastparquet pyarrow
要在读取 Parquet 文件时指定引擎,您可以将其作为参数传递,如下所示:
import pandas as pd
df_pyarrow = pd.read_parquet('people.parquet', engine='pyarrow')
df_fastparquet = pd.read_parquet('people.parquet', engine='fastparquet')
print('Using PyArrow')
print(df_pyarrow)
print('Using fastparquet')
print(df_fastparquet)
Output:
Using PyArrow
Name Age City
0 John 28 New York
1 Anna 24 Paris
2 Peter 35 Berlin
3 Linda 32 London
Using fastparquet
Name Age City
0 John 28 New York
1 Anna 24 Paris
2 Peter 35 Berlin
3 Linda 32 London
在这些示例中,我们指定用于读取 Parquet 文件的引擎。虽然结果数据相同,但性能可能存在差异。
让我们衡量一下:
import pandas as pd
import time
start_time = time.time()
df_pyarrow = pd.read_parquet('people.parquet', engine='pyarrow')
end_time = time.time()
pyarrow_time = end_time - start_time
print('Time taken using PyArrow: {} seconds'.format(pyarrow_time))
start_time = time.time()
df_fastparquet = pd.read_parquet('people.parquet', engine='fastparquet')
end_time = time.time()
fastparquet_time = end_time - start_time
print('Time taken using fastparquet: {} seconds'.format(fastparquet_time))
Output:
Time taken using PyArrow: 0.0388336181640625 seconds
Time taken using fastparquet: 0.12515997886657715 seconds
结果是从 Parquet 文件中读取 4 条记录和 3 列。
指定要加载的列
The read_parquet
函数还允许您指定从 Parquet 文件加载哪些列。当处理具有许多列的大型数据集时,这尤其有用。
您可以通过将列名列表传递给columns
的参数read_parquet
功能:
import pandas as pd
df = pd.read_parquet('people.parquet', columns=['Name', 'Age'])
print(df)
Output:
Name Age
0 John 28
1 Anna 24
2 Peter 35
3 Linda 32
在此示例中,我们仅从 Parquet 文件加载“Name”和“Age”列。从输出中可以看到,生成的 DataFrame 仅包含这两列。
使用分区的 Parquet 文件
分区是一种根据一个或多个列的值将数据拆分到多个文件的技术。
该技术可以显着加快查询和数据加载速度,因为它限制了需要扫描的数据量。
每个分区将表示为输出目录中的单独子目录,每个子目录中的文件名将反映分区列的值。
例如,如果您根据“年”和“月”列对数据进行分区,则文件名将遵循以下结构:
partitioned_people/
└── year=2021/
└── month=01/
├── part.0.parquet
├── part.1.parquet
└── ...
└── year=2021/
└── month=02/
├── part.0.parquet
├── part.1.parquet
└── ...
└── ...
在此示例中,每个子目录代表“年”和“月”值的唯一组合。在每个子目录中,您将找到包含与该分区对应的数据的 Parquet 文件。
当读取分区的 Parquet 数据时,Pandasread_parquet
将目录中的每个文件视为一个单独的 DataFrame,然后将它们连接成一个大的 DataFrame。
以下是读取分区数据的方法:
import pandas as pd
df = pd.read_parquet('partitioned_people')
print(df)
The read_parquet
函数将自动检测分区方案并从子目录中的所有 Parquet 文件中读取数据。生成的数据帧(df
在上面的示例中)将包含所有分区的合并数据。
进一步阅读
https://pandas.pydata.org/docs/reference/api/pandas.read_parquet.html