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

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

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

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

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

但是现在我有个需求,分箱,具体来讲,需要『排序后遍历每一行及其邻居比如 ii+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}

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

期待有朋友有更好的方法指点!这个问题困扰了我很久!

我的微信:PiperLHJ

【求助】如何从 Spark 的 DataFrame 中取出具体某一行?我自己的一些思考相关推荐

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

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

  2. 通过迭代在DataFrame中取出满足某种条件的列,函数 —— .columns

    举一个例子展示,其他用法可以类推: binary_variables = [c for c in train.columns if train[c].nunique() == 2] 除此之外,说明一下 ...

  3. 如何在DataFrame 中优雅的增加一行,一列

    <font color='darkgreen',size=4.5>    优雅的增加一行,一定要优雅! df=DataFrame(np.arange(16).reshape((4,4)), ...

  4. pandas计算dataframe两列数据值相等的行号、取出DataFrame中两列值相等的行号

    pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号 目录 pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号

  5. Spark读取MySQL中的数据为DataFrame

    Spark读取JDBC中的数据(以MySQL为例)为DataFrame,有两种方式. //聚合的时候默认分区是200,可以在此设置 val spark = SparkSession.builder() ...

  6. 【Spark】sparksql中使用自定义函数

    代码中分别用面向对象和面向函数两种写法自定义了两个函数: low2Up: 小写转大写 up2Low: 大写转小写 import org.apache.spark.sql.types.StringTyp ...

  7. 外部数据源 之 Plugin 可插拔的方式整合到Spark中/Spark源码中

    一:概念理解 Plugin 可插拔的方式整合到Spark中/Spark源码中 为了在用外部数据源读取文件的时候,本来读取是valui 使他变成一个带schema的df 有具体的信息 外部数据源就是把很 ...

  8. 向Spark的DataFrame增加一列数据

    前言 先说个题外话,如何给hive表增加一个列,并且该把该列的所有字段设为'China'? 如果仅仅是增加一列倒是很简单: alter table test add columns(flag stri ...

  9. 将一个DataFrame中的一列(行),插入到另一个DataFrame中

    原始数据: import pandas as pd import numpy as npdata = {'a': [4, 6, 5, 7, 8],'b': ['w', 't', 'y', 'x', ' ...

最新文章

  1. webstorm常用快捷键
  2. linux -- /dev/null 21
  3. sqlserver日志文件过大的处理方法
  4. 电视盒子root_电视盒子 免root 去广告换桌面,20分钟还原干净清爽的桌面
  5. 不做在线电商,或许才是永辉超市的未来
  6. Boost:与gz文件相关的操作实例
  7. php+header+跳转输出,php利用header跳转怎么失效了?
  8. 《利用python进行数据分析》读书笔记--第十章 时间序列(一)
  9. mysql教程实验4.1_【MySQL】数据库课程实验
  10. 网络管理软件,这个市场肉很多
  11. 联想教育应用使用说明(7.6版本)——第2章 联想教育应用的首次部署
  12. Qt 周立功USBCAN总线上位机
  13. python压缩图片 指定大小
  14. 计算机 教学活动设计方案,青岛出版社初中信息技术 七年级下册第二单元 第5课 设计活动策划方案 教学设计...
  15. C语言编程>第二十七周 ③ 请补充fun函数,该函数的功能是计算并输出下列多项式的值:
  16. 电脑启动计算机无法启动 修复工具栏,如何利用Win7启动修复功能解决电脑启动进不了系统的问题...
  17. 《计算机系统基础》—— 运算
  18. 给寸照换底色(抠头发)
  19. redis键值出现 \xac\xed\x00\x05t\x00的解决方法
  20. 一篇全了解Spring全注解详解

热门文章

  1. Linux 命令 之 【chmod】 修改文件权限~
  2. 关于PyCharm卡顿的问题
  3. 网络管理与维护作业12
  4. css样式float造成的浮动“塌陷”问题的解决办法
  5. Python安装常见问题:ModuleNotFoundError: No module named ‘_ctypes‘ 解决办法
  6. JPA和Hibernate-条件与JPQL或HQL
  7. 选择a哪个href以某个字符串结尾
  8. window.open打开页面并传值,window. location.search遍历获取到的请求链接中的所有参数
  9. 分页标签commons.tld,NavigationTag,Page
  10. eclipse jstl包_我的Java Web之路41 - JSTL初步使用