阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

从 Spark 的 DataFrame 中取出具体某一行详解

98次阅读
没有评论

共计 1187 个字符,预计需要花费 3 分钟才能阅读完成。

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

从 Spark 的 DataFrame 中取出具体某一行详解

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

根据阿里专家 Spark 的 DataFrame 不是真正的 DataFrame- 秦续业的文章

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 语句查找:

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

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

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

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

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

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

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

这个方法似乎靠谱。

附加方案:ml.feature.Bucketizer

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

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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1187字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中