Spark窗口函数中为何需在末尾使用drop()?
理解Spark中
drop()在窗口函数示例里的作用 嘿,刚接触Spark窗口函数很正常,这个drop()的用法其实很好理解,我给你拆解下:
1. drop("rn")的核心作用
在这个示例里,rn是我们通过窗口函数临时生成的辅助列——它的唯一作用就是帮我们筛选出每个Subject下Fee最高的那条记录(通过where($"rn"===1))。当筛选完成后,这个rn列就完全没用了,drop("rn")就是把这个临时列从最终的DataFrame里移除,让结果只保留我们真正需要的原始数据列(比如Subject、Fee这些你原本的字段)。
简单说:它就是帮你“清理临时数据”,把为了实现筛选逻辑而额外加的列删掉,让输出结果更简洁、符合预期。
2. 如果不使用drop()会有什么影响?
如果删掉这行代码,最终的dfTop里会多一列rn,而且所有行的rn值都是1(因为我们只筛选了rn=1的记录)。这会带来两个小问题:
- 数据冗余:多了一列完全无关的列,会占用额外的内存或存储资源(数据量小的时候不明显,数据量大就会有实际影响);
- 结果不符合预期:你本来想要的是“每个Subject最高Fee的原始记录”,结果多了个多余的
rn列,后续如果把这个DataFrame用于报表或其他分析,这个无关列可能会造成混淆。
举个直观的例子
假设你的input数据是这样的:
| Subject | Fee |
|---|---|
| Math | 200 |
| Math | 300 |
| English | 150 |
用了drop("rn")后,dfTop.show()的结果是:
| Subject | Fee |
|---|---|
| Math | 300 |
| English | 150 |
如果不用drop("rn"),结果会变成:
| Subject | Fee | rn |
|---|---|---|
| Math | 300 | 1 |
| English | 150 | 1 |
这样是不是就一目了然啦?
内容的提问来源于stack exchange,提问作者M_Gandhi
相关产品推荐
相关产品推荐

