[ PROMPT_NODE_26418 ]
bags
[ SKILL_DOCUMENTATION ]
# Dask Bags
## 概述
Dask Bag 在通用 Python 对象上实现了包括 `map`、`filter`、`fold` 和 `groupby` 在内的函数式操作。它通过 Python 迭代器并行处理数据,同时保持较小的内存占用。Bags 的功能类似于“PyToolz 的并行版本或 PySpark RDD 的 Pythonic 版本”。
## 核心概念
Dask Bag 是分布在分区中的 Python 对象集合:
- 每个分区包含通用 Python 对象
- 操作使用函数式编程模式
- 处理过程使用流/迭代器以提高内存效率
- 非常适合非结构化或半结构化数据
## 关键能力
### 函数式操作
- `map`:转换每个元素
- `filter`:根据条件选择元素
- `fold`:使用组合函数归约元素
- `groupby`:按键对元素进行分组
- `pluck`:从记录中提取字段
- `flatten`:展平嵌套结构
### 用例
- 文本处理和日志分析
- JSON 记录处理
- 非结构化数据的 ETL
- 结构化分析前的数据清洗
## 何时使用 Dask Bags
**在以下情况使用 Bags**:
- 处理需要灵活计算的通用 Python 对象
- 数据不适合结构化数组或表格格式
- 处理文本、JSON 或自定义 Python 对象
- 需要初始数据清洗和 ETL
- 内存高效的流处理很重要
**在以下情况使用其他集合**:
- 数据是结构化的(改用 DataFrames)
- 数值计算(改用 Arrays)
- 操作需要复杂的 groupby 或洗牌(改用 DataFrames)
**关键建议**:使用 Bag 清洗和处理数据,然后在进行需要洗牌步骤的更复杂操作之前,将其转换为数组或 DataFrame。
## 重要限制
Bags 为了通用性牺牲了性能:
- 依赖多进程调度(而非线程)
- 保持不可变(更改时创建新的 bags)
- 操作速度比数组/DataFrame 等效项慢
- 处理 `groupby` 的效率较低(尽可能使用 `foldby`)
- 需要大量工作节点间通信的操作速度较慢
## 创建 Bags
### 从序列创建
python
import dask.bag as db
# 从 Python 列表
bag = db.from_sequence([1, 2, 3, 4, 5], partition_size=2)
# 从 range
bag = db.from_sequence(range(10000), partition_size=1000)
### 从文本文件创建
python
# 单个文件
bag = db.read_text('data.txt')
# 使用 glob 的多个文件
bag = db.read_text('data/*.txt')
# 指定编码
bag = db.read_text('data/*.txt',