spark streaming - 在一个流中创建tmp视图,在另一个流中使用

时间:2017-03-06 18:45:38

标签: scala apache-spark spark-streaming spark-dataframe

我试图运行2个Dstream,在第一个中生成Dataframe,将df注册为tmp视图,然后在另一个Dstream中使用它,如下所示:

dstream1.foreachRDD { rdd =>
  import org.apache.spark.sql._
  val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate
  import spark.implicits._
  import spark.sql

  val records = rdd.toDF("record")
  records.createOrReplaceTempView("records")
}
dstream2.foreachRDD { rdd =>
  import org.apache.spark.sql._
  val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate
  import spark.implicits._
  import spark.sql

  val records2 = rdd.toDF("record2")
  val oldRecord = spark.table("records")
  records2.join(oldRecod).write.json(...)
}
streamingContext.remember(Seconds(60))
    streamingContext.start()
    streamingContext.awaitTermination()

我一直在org.apache.spark.sql.catalyst.analysis.NoSuchTableException 所以很明显我没有做对。

有没有办法让这种情况发生?

谢谢!

1 个答案:

答案 0 :(得分:0)

这实际上有效, 问题是,在本地测试时,您需要留下额外的核心进行计算,然后从流中提取数据。

我使用master = local [2],因此每个核心用于处理每个流而非左侧用于执行任何其他操作。 一旦我将它改为master = local [4]它就可以了。