【求助】如何从 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
的作用和我实现的需求差不多(尽管细节不同),我猜测其中也应该有相似逻辑。有能力和精力了应该去读读源码,看看官方怎么实现的。
期待有朋友有更好的方法指点!这个问题困扰了我很久!
我的微信:PiperLHJ
【求助】如何从 Spark 的 DataFrame 中取出具体某一行?我自己的一些思考相关推荐
- 从 Spark 的 DataFrame 中取出具体某一行详解
Spark 中 DataFrame 是 RDD 的扩展,限于其分布式与弹性内存特性,我们没法直接进行类似 df.iloc(r, c) 的操作来取出其某一行. 如何从 Spark 的 DataFrame ...
- 通过迭代在DataFrame中取出满足某种条件的列,函数 —— .columns
举一个例子展示,其他用法可以类推: binary_variables = [c for c in train.columns if train[c].nunique() == 2] 除此之外,说明一下 ...
- 如何在DataFrame 中优雅的增加一行,一列
<font color='darkgreen',size=4.5> 优雅的增加一行,一定要优雅! df=DataFrame(np.arange(16).reshape((4,4)), ...
- pandas计算dataframe两列数据值相等的行号、取出DataFrame中两列值相等的行号
pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号 目录 pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号
- Spark读取MySQL中的数据为DataFrame
Spark读取JDBC中的数据(以MySQL为例)为DataFrame,有两种方式. //聚合的时候默认分区是200,可以在此设置 val spark = SparkSession.builder() ...
- 【Spark】sparksql中使用自定义函数
代码中分别用面向对象和面向函数两种写法自定义了两个函数: low2Up: 小写转大写 up2Low: 大写转小写 import org.apache.spark.sql.types.StringTyp ...
- 外部数据源 之 Plugin 可插拔的方式整合到Spark中/Spark源码中
一:概念理解 Plugin 可插拔的方式整合到Spark中/Spark源码中 为了在用外部数据源读取文件的时候,本来读取是valui 使他变成一个带schema的df 有具体的信息 外部数据源就是把很 ...
- 向Spark的DataFrame增加一列数据
前言 先说个题外话,如何给hive表增加一个列,并且该把该列的所有字段设为'China'? 如果仅仅是增加一列倒是很简单: alter table test add columns(flag stri ...
- 将一个DataFrame中的一列(行),插入到另一个DataFrame中
原始数据: import pandas as pd import numpy as npdata = {'a': [4, 6, 5, 7, 8],'b': ['w', 't', 'y', 'x', ' ...
最新文章
- webstorm常用快捷键
- linux -- /dev/null 21
- sqlserver日志文件过大的处理方法
- 电视盒子root_电视盒子 免root 去广告换桌面,20分钟还原干净清爽的桌面
- 不做在线电商,或许才是永辉超市的未来
- Boost:与gz文件相关的操作实例
- php+header+跳转输出,php利用header跳转怎么失效了?
- 《利用python进行数据分析》读书笔记--第十章 时间序列(一)
- mysql教程实验4.1_【MySQL】数据库课程实验
- 网络管理软件,这个市场肉很多
- 联想教育应用使用说明(7.6版本)——第2章 联想教育应用的首次部署
- Qt 周立功USBCAN总线上位机
- python压缩图片 指定大小
- 计算机 教学活动设计方案,青岛出版社初中信息技术 七年级下册第二单元 第5课 设计活动策划方案 教学设计...
- C语言编程>第二十七周 ③ 请补充fun函数,该函数的功能是计算并输出下列多项式的值:
- 电脑启动计算机无法启动 修复工具栏,如何利用Win7启动修复功能解决电脑启动进不了系统的问题...
- 《计算机系统基础》—— 运算
- 给寸照换底色(抠头发)
- redis键值出现 \xac\xed\x00\x05t\x00的解决方法
- 一篇全了解Spring全注解详解
热门文章
- Linux 命令 之 【chmod】 修改文件权限~
- 关于PyCharm卡顿的问题
- 网络管理与维护作业12
- css样式float造成的浮动“塌陷”问题的解决办法
- Python安装常见问题:ModuleNotFoundError: No module named ‘_ctypes‘ 解决办法
- JPA和Hibernate-条件与JPQL或HQL
- 选择a哪个href以某个字符串结尾
- window.open打开页面并传值,window. location.search遍历获取到的请求链接中的所有参数
- 分页标签commons.tld,NavigationTag,Page
- eclipse jstl包_我的Java Web之路41 - JSTL初步使用