如何在Spark Streaming中异步运行对流数据定义的表的SQL查询?

时间:2016-11-23 07:27:02

标签: apache-spark apache-spark-sql spark-streaming

DataFrame and SQL Operations部分中的官方Spark Streaming Programming Guide提到了异步运行SQL查询:

  

您还可以对来自不同线程的流数据上定义的表运行SQL查询(即,与正在运行的StreamingContext异步)。

是否有任何示例/示例显示如何操作?

1 个答案:

答案 0 :(得分:2)

文档必须提及它真的很有趣,因为任何使用相同SparkSession的线程都可以访问任何临时表。

我会这样做:

// Create a fixed thread pool to execute asynchronous tasks
val executorService = Executors.newFixedThreadPool(1)
dstream.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")

  // Submit a asynchronous task to execute a SQL query
  executorService.submit {
    new Runnable {
      override def run(): Unit = {
        sql("select * from records").show(truncate = false)
      }
    }
  }
}