我需要在RDD子集上执行SQL函数,增加大小。为此,我必须使用take
函数从输入RDD获取子集:
def main(args: Array[String]) {
// set up environment
val conf = new SparkConf()
.setMaster("local[5]")
.setAppName("Test")
.set("spark.executor.memory", "4g")
val sc = new SparkContext(conf)
val cntPairsRdd = cntsRdd.map(n => {
val sample = data0.take(n)
val dataRDD = sc.parallelize(sample)
val df = dataRDD.toDF()
val result = df.select( ...)
val xCnt = result.count
(n, xCnt)
})
}
cntsRdd
是一组递增的整数。函数take
返回list
而不是RDD
。因此,要使我的SQL工作,我首先需要将列表转换为RDD
,然后转换为dataframe
。不幸的是,在map
函数中,Spark不允许创建另一个RDD
。换句话说,在Spark中,无法在另一个RDD
内创建RDD
。由于同样的原因,Spark不支持SparkContext
血清化。在尝试sc.parallelize(sample)
时我得到了血清异常。
请提供一些解决方法,以便在RDD子集上执行SQL函数,如本方案中所定义。