数据保存为Feather 和 Parquet格式

关于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)

 

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值