apache-spark - 从大型数据集创建数据框,之前将其加载到驱动程序上
问题描述
由于驱动程序内存不足,我需要将大型数据集转换为数据帧。该数据是从 HTTP 请求/响应中接收的。
短手的例子,
// Size of this is over GBs
var dataFromHttp = http('http://my.com/verylargedata')
// Convert data to custom Scala/Java Object Array
var objectSeq = convertDataToSeq(dataFromHttp)
// Convert it to dataframe
var df = sqlContext.createDataFrame(objectSeq, ...)
有什么办法可以df
直接在executor上制作吗?(dataFromHttp
不应加载到驱动程序上)
解决方案
一个起点是使用一个执行器读取数据,展平结果并将生成的 RDD 转换为数据帧。通常,执行程序的内存比驱动程序多得多,因此它可能对您有用。
// we start with a one row RDD, and flatten it.
val rdd = sc.parallelize(Seq(1)).flatMap( _ => {
val dataFromHttp = http("http://my.com/verylargedata")
convertDataToSeq(dataFromHttp)
})
// we convert it to a dataframe
val columnNames = Seq("A", "B", ...)
val df = rdd.toDF(columnNames :_*)
推荐阅读
- python - 我的自定义模块未安装在 odoo 平台上
- c# - 如何在基于 DataTrigger 的 DataGrid 中为 Expander 着色?
- protocol-buffers - 如果协议缓冲区中的数据大于 64 字节,则无法解包数据
- tcp - Modbus TCP 远程端口
- r - 分类医学变量的数据汇总
- php - 全文搜索在 php mysql 中不起作用
- .net-core - 为什么内部模型没有更新
- node.js - 使用 Gitlab Runner 部署到 Digital Ocean 时,“docker pull”恰好需要 1 个参数错误
- php - PHP JSON数组访问
- cucumber - 是否可以与 webdriverio 并行运行 Cucumber 示例表?