首页 > 解决方案 > 从大型数据集创建数据框,之前将其加载到驱动程序上

问题描述

由于驱动程序内存不足,我需要将大型数据集转换为数据帧。该数据是从 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不应加载到驱动程序上)

标签: apache-sparkapache-spark-sql

解决方案


一个起点是使用一个执行器读取数据,展平结果并将生成的 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 :_*)

推荐阅读