如何从 Spark 的 DataFrame 中取出具体某一行?

开发 前端 Spark
Spark 中 DataFrame 是 RDD 的扩展,限于其分布式与弹性内存特性,我们没法直接进行类似 df.iloc(r, c) 的操作来取出其某一行。

[[411938]]

如何从 Spark 的 DataFrame 中取出具体某一行?

根据阿里专家Spark的DataFrame不是真正的DataFrame-秦续业的文章-知乎[1]的文章:

  • DataFrame 应该有『保证顺序,行列对称』等规律
  • 因此「Spark DataFrame 和 Koalas 不是真正的 DataFrame」

确实可以运行,但却看到一句话,大意是数据会被放到一个分区来执行,这正是因为数据本身之间并不保证顺序,因此只能把数据收集到一起,排序,再调用 shift。这样就不再是一个分布式的程序了,甚至比 pandas 本身更慢。

我们可以明确一个前提:Spark 中 DataFrame 是 RDD 的扩展,限于其分布式与弹性内存特性,我们没法直接进行类似 df.iloc(r, c) 的操作来取出其某一行。

但是现在我有个需求,分箱,具体来讲,需要『排序后遍历每一行及其邻居比如 i 与 i+j』,因此,我们必须能够获取数据的某一行!

不知道有没有高手有好的方法?我只想到了以下几招!

1/3排序后select再collect

collect 是将 DataFrame 转换为数组放到内存中来。但是 Spark 处理的数据一般都很大,直接转为数组,会爆内存。

因此不能直接 collect 。

要处理哪一列,就直接 select('列名') 取出这一列就好,再 collect 。我的数据有 2e5 * 2e4 这么多,因此 select 后只剩一列大小为 2e5 * 1 ,还是可以 collect 的。

这显然不是个好方法!因为无法处理真正的大数据,比如行很多时。

2/3排序后加index然后用SQL查找

给 DataFrame 实例 .sort("列名") 后,用 SQL 语句查找:

 

  1. select 列名 from df_table where 索引列名 = i 

我对于 SQL 不是很了解,因此这个做法只是在构思阶段。

此外,我不清楚 SQL 的性能!我要调用很多次 df.iloc[i, 列] ,那这样会不会太慢了?

3/3排序后加index然后转置查找列名

这个想法也只是停留在脑子里!因为会有些难度。

给每一行加索引列,从0开始计数,然后把矩阵转置,新的列名就用索引列来做。

之后再取第 i 个数,就 df(i.toString) 就行。

这个方法似乎靠谱。

附加方案:ml.feature.Bucketizer

  1. import org.apache.spark.ml.feature.{Bucketizer, QuantileDiscretizer} 

spark中 Bucketizer 的作用和我实现的需求差不多(尽管细节不同),我猜测其中也应该有相似逻辑。有能力和精力了应该去读读源码,看看官方怎么实现的。

参考资料

[1]Spark的DataFrame不是真正的DataFrame-秦续业的文章-知乎:

https://zhuanlan.zhihu.com/p/135329592

 

责任编辑:姜华 来源: Piper蛋窝
相关推荐

2021-07-21 07:55:22

技术

2022-11-08 09:38:18

Linux命令行删除文件

2020-01-10 22:56:56

Python图像处理Linux

2020-08-24 08:25:48

Python开发工具

2020-09-09 16:00:22

Linux进程

2016-12-02 08:53:18

Python一行代码

2017-04-05 11:10:23

Javascript代码前端

2024-11-13 09:27:04

2011-03-25 10:49:30

Join一对多

2021-11-02 16:25:41

Python代码技巧

2015-11-09 17:59:57

2015-11-09 17:04:57

2014-02-12 13:43:50

代码并行任务

2022-04-09 09:11:33

Python

2020-08-12 14:54:00

Python代码开发

2021-07-26 10:32:54

MySQL数据库存储

2020-07-20 09:20:48

代码geventPython

2021-08-31 09:49:37

CPU执行语言

2021-10-19 17:52:16

Git命令算数

2017-04-13 19:20:18

Python代码并行任务
点赞
收藏

51CTO技术栈公众号