关于Feather 和 Parquet 的保存与读取,包括如何只读取数据的一部分,大大减少读取数据时间,代码放在文章后半部分~
Feather 和 Parquet 都是用于存储和处理数据的文件格式,在数据科学和大数据领域应用广泛,以下是关于它们的详细介绍:
定义与背景
- Feather:是一种轻量级的、基于 Apache Arrow 的列式存储格式,主要用于在不同的数据分析工具和语言之间快速高效地交换数据。它旨在提供一种简单、快速且跨平台的数据存储方式,使得数据可以在 Python、R 等多种语言和相关的数据处理框架之间轻松传递。
- Parquet:是一种面向列的存储格式,最初是为了 Hadoop 生态系统而开发的,旨在高效地存储和处理大规模的数据分析工作负载。它被设计用于支持复杂的嵌套数据结构,并能与多种大数据处理框架(如 Hive、Spark 等)良好集成。
特点
- Feather
- 快速读写:利用 Apache Arrow 的内存格式,能实现快速的数据读写操作,尤其在处理中等规模数据时性能表现出色。
- 语言兼容性:支持多种编程语言,如 Python、R 等,方便不同语言环境下的数据共享和交互。
- 简单易用:提供了简洁的 API,使用户可以轻松地进行数据的存储和加载操作。
- 内存映射:支持内存映射文件,允许数据在不加载到内存的情况下进行访问,减少了内存占用,提高了数据处理效率。
- Parquet
- 高效压缩:采用了多种先进的压缩算法,如 Snappy、Gzip 等,能够有效地减少数据存储空间,降低存储成本,同时提高数据的传输和处理速度。
- 列式存储:数据按列存储,这使得在进行查询时,只需要读取查询所需的列,大大减少了 I/O 开销,提高了查询性能,尤其在处理大规模数据集和复杂查询时优势明显。
- 支持复杂数据类型:能够很好地处理嵌套和复杂的数据结构,如数组、结构体等,适用于存储各种类型的半结构化和非结构化数据。
- 与大数据生态系统集成:与 Hadoop、Spark、Hive 等大数据处理框架紧密集成,是大数据分析场景下的常用存储格式。
应用场景
- 数据规模
- Feather:一般适用于中等规模及以下的数据。通常在处理几十 MB 到几 GB 的数据时,Feather 能够很好地发挥其快速读写和内存映射的优势,方便在本地进行数据处理和交互。
- Parquet:更适合处理大规模数据,尤其是在处理 TB 级甚至更大规模的数据时,Parquet 的列式存储和高效压缩特性能够显著减少存储成本和 I/O 开销,提高数据处理效率。
- 性能需求
- Feather:在读写速度方面表现出色,尤其是对于快速加载数据到内存进行分析的场景,它能够利用内存映射技术,快速将数据映射到内存中,减少数据加载时间。
- Parquet:在查询性能上有优势,特别是在进行列裁剪和过滤操作时,只需要读取相关列的数据,大大提高了查询效率。对于需要频繁进行复杂查询和数据分析的场景,Parquet 更能满足性能需求。
- 数据类型支持
- Feather:支持常见的数据类型,能满足大多数基本的数据分析需求,但对复杂嵌套数据结构的支持相对有限。
- Parquet:对复杂数据类型(如嵌套的结构体、数组等)有很好的支持,适合存储和处理半结构化和非结构化数据,如 JSON 格式的数据等。
- 兼容性与生态系统
- Feather:主要与 Python、R 等数据分析语言和相关的库(如 Pandas、R 的 arrow 包等)兼容性较好,在单机数据处理和小型数据分析项目中使用方便。
- Parquet:与大数据处理框架(如 Hive、Spark、Impala 等)紧密集成,在大数据生态系统中具有广泛的支持和应用,是 Hadoop 生态下数据存储和处理的常用格式之一。
读取与保存:
1.读取与保存:
- Feather格式:
# 需要安装 pandas 和 pyarrow 库
# pip install pandas pyarrow
import pandas as pd
# 示例
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
# 保存为 Feather 格式
file_path = 'example.feather'
df.to_feather(file_path)
print(f"DataFrame 已保存为 {file_path}")
# 读取 Feather 文件
loaded_df = pd.read_feather(file_path)
print(loaded_df)
- Parquet格式:
# 需要安装 pandas 和 pyarrow 库,若使用 fastparquet 引擎,还需安装 fastparquet 库
# pip install pandas pyarrow fastparquet
import pandas as pd
# 示例
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
# 保存为 Parquet 格式,使用 pyarrow 引擎
file_path = 'example.parquet'
df.to_parquet(file_path, engine='pyarrow')
print(f"DataFrame 已保存为 {file_path}")
# 读取 Parquet 文件
loaded_df = pd.read_parquet(file_path, engine='pyarrow')
print(loaded_df)
2.读取部分列:
无论是 Feather 还是 Parquet 格式,都可以通过指定columns
参数来选择需要读取的列。
import pandas as pd
# 读取Feather文件的部分列
feather_file_path = 'your_file.feather'
feather_df = pd.read_feather(feather_file_path, columns=['col1', 'col3']) # 假设文件中有col1, col2, col3列,这里只读取col1和col3
# 读取Parquet文件的部分列
parquet_file_path = 'your_file.parquet'
parquet_df = pd.read_parquet(parquet_file_path, columns=['col1', 'col3'])
3.按条件筛选读取部分行:
Parquet 是一种列式存储格式,支持谓词下推(Predicate Pushdown)技术,这意味着可以在读取数据时就根据条件筛选,而无需将整个文件加载到内存中。在 Python 中用 pandas
和 pyarrow
可以实现这一点。
数据量太大又只需读部分满足条件的行时很推荐哦~
import pandas as pd
# 定义 Parquet 文件路径
parquet_file_path = 'your_file.parquet'
# 定义筛选条件,例如筛选出 'age' 列大于 25 的行
filters = [('age', '>', 25)]
# 使用 read_parquet 函数并传入 filters 参数
df = pd.read_parquet(parquet_file_path, filters=filters)
print(df)
但是Feather 本身不支持在读取时直接进行条件筛选,因为它主要设计用于快速的数据交换,没有内置的谓词下推功能。不过可以采用分块读取的方式,逐块筛选数据,从而减少内存占用。
import pandas as pd
# 定义 Feather 文件路径
feather_file_path = 'your_file.feather'
# 定义一个空的 DataFrame 用于存储筛选后的结果
filtered_df = pd.DataFrame()
# 分块读取 Feather 文件
chunk_size = 1000 # 可以根据实际情况调整块的大小
for chunk in pd.read_feather(feather_file_path, chunksize=chunk_size):
# 筛选出 'age' 列大于 25 的行
filtered_chunk = chunk[chunk['age'] > 25]
# 将筛选后的块添加到结果 DataFrame 中
filtered_df = pd.concat([filtered_df, filtered_chunk], ignore_index=True)
print(filtered_df)