foreachRDD中的案例类导致序列化错误

时间:2019-01-05 21:54:24

标签: apache-spark dstream

如果我不尝试使用案例类,而简单地让列的默认名称由toDF()来创建,或者如果我通过toDF(“ c1,” c2“)对其进行分配,则可以在foreachRDD中创建DF。

当我尝试使用Case类并查看示例后,我得到:

Task not serializable

如果我转移Case Class语句,我将得到:

toDF() not part of RDD[CaseClass]

这是传统,但我对Spark可能产生的第n个序列化错误以及是否将其延续到结构化流中感到好奇。

我有一个不需要拆分的RDD,这可能是问题所在吗?没有。在DataBricks中运行?

编码如下:

import org.apache.spark.sql.SparkSession
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.{Seconds, StreamingContext}
import scala.collection.mutable

case class Person(name: String, age: Int) //extends Serializable // Some say inherently serializable so not required

val spark = SparkSession.builder
    .master("local[4]")
    .config("spark.driver.cores", 2)
    .appName("forEachRDD")
    .getOrCreate()

val sc = spark.sparkContext
val ssc = new StreamingContext(spark.sparkContext, Seconds(1)) 

val rddQueue = new mutable.Queue[RDD[List[(String, Int)]]]()
val QS = ssc.queueStream(rddQueue) 

QS.foreachRDD(q => {
   if(!q.isEmpty) {   
      import spark.implicits._
      val q_flatMap = q.flatMap{x=>x}
      val q_withPerson = q_flatMap.map(field => Person(field._1, field._2))
      val df = q_withPerson.toDF() 
      df.show(false)
   }
 }
)

ssc.start()
for (c <- List(List(("Fred",53), ("John",22), ("Mary",76)), List(("Bob",54), ("Johnny",92), ("Margaret",15)), List(("Alfred",21), ("Patsy",34), ("Sylvester",7)) )) {
 rddQueue += ssc.sparkContext.parallelize(List(c))
} 
ssc.awaitTermination() 

1 个答案:

答案 0 :(得分:0)

在Java方面还没有长大,但是四处看看,我发现该怎么做,但是不够专业,无法解释。

我正在一个DataBricks笔记本中运行原型。

线索是

case class Person(name: String, age: Int)

位于同一数据库笔记本中。需要在当前笔记本外部定义案例类(在单独的笔记本中),从而与运行Streaming的类分开。