1. DataFrame 操作的类型划分及其常见方法
DataFrame 操作的类型划分及其常见方法:
不触发Action
触发Action
<<abstract>>
DataFrame操作
<<lazy>>
转换操作
+select()
+filter()
+where()
+groupBy()
+agg()
+orderBy()
+sort()
+distinct()
+drop()
+withColumn()
+withColumnRenamed()
+join()
+union()
+sample()
+repartition()
+coalesce()
+limit()
+rollup()
+cube()
+pivot()
<<eager>>
动作操作
+show()
+collect()
+count()
+take()
+head()
+first()
+foreach()
+save()
+write()
+toPandas()
+toJSON()
+toLocalIterator()
+printSchema()
+explain()
+cache()
+persist()
2. 表格表示
下表列出了常见的 DataFrame 操作及其是否触发 Action:
| 操作名称 | 类型 | 是否触发 Action | 描述 |
|---|---|---|---|
| select() | 转换 | 否 | 选择指定列,返回新的 DataFrame |
| filter() / where() | 转换 | 否 | 根据条件过滤行 |
| groupBy() | 转换 | 否 | 按指定列分组 |
| agg() | 转换 | 否 | 执行聚合操作 |
| orderBy() / sort() | 转换 | 否 | 按指定列排序 |
| distinct() | 转换 | 否 | 去重操作 |
| drop() | 转换 | 否 | 删除指定列 |
| withColumn() | 转换 | 否 | 添加或替换列 |
| withColumnRenamed() | 转换 | 否 | 重命名列 |
| join() | 转换 | 否 | 连接两个 DataFrame |
| union() | 转换 | 否 | 合并两个 DataFrame |
| sample() | 转换 | 否 | 随机采样 |
| repartition() | 转换 | 否 | 重新分区 |
| coalesce() | 转换 | 否 | 减少分区数 |
| limit() | 转换 | 否 | 限制返回行数 |
| rollup() / cube() | 转换 | 否 | 多维聚合 |
| pivot() | 转换 | 否 | 数据透视 |
| show() | 动作 | 是 | 显示前 n 行数据 |
| collect() | 动作 | 是 | 将所有数据收集到驱动程序 |
| count() | 动作 | 是 | 统计行数 |
| take() | 动作 | 是 | 取前 n 行数据 |
| head() / first() | 动作 | 是 | 取第一行或前几行数据 |
| foreach() | 动作 | 是 | 对每行应用函数 |
| save() / write() | 动作 | 是 | 将数据写入外部存储 |
| toPandas() | 动作 | 是 | 转换为 Pandas DataFrame |
| toJSON() | 动作 | 是 | 转换为 JSON 格式 |
| toLocalIterator() | 动作 | 是 | 返回本地迭代器 |
| printSchema() | 动作 | 是 | 打印 schema 信息 |
| explain() | 动作 | 是 | 显示执行计划 |
| cache() / persist() | 动作 | 是 | 缓存 DataFrame |
关键区别
-
转换操作(Transformations):
- 惰性执行,不立即计算
- 返回新的 DataFrame
- 构建逻辑执行计划(DAG)
- 需要动作操作触发实际执行
-
动作操作(Actions):
- 立即触发计算
- 返回具体结果或执行输出。注:某些操作如
printSchema()、explain()虽然不返回计算结果,但仍属于动作操作,因为它们会触发 Spark 分析逻辑计划并返回信息。 - 执行所有累积的转换操作
- 可能涉及数据移动(如 collect())