Spark:在RDD子集上执行SQL函数

时间:2016-01-18 20:53:51

标签: apache-spark apache-spark-sql

我需要在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函数,如本方案中所定义。

0 个答案:

没有答案