【问题标题】:Getting error saying "Queries with streaming sources must be executed with writeStream.start()" on spark structured streaming [duplicate]在 Spark 结构化流式传输中出现错误提示“必须使用 writeStream.start() 执行带有流式传输源的查询”[重复]
【发布时间】:2019-05-25 10:05:36
【问题描述】:

在 spark 结构流式传输之上执行 spark SQL 时遇到了一些问题。 PFA 错误。

这是我的代码

 object sparkSqlIntegration {
    def main(args: Array[String]) {
     val spark = SparkSession
         .builder
         .appName("StructuredStreaming")
         .master("local[*]")
         .config("spark.sql.warehouse.dir", "file:///C:/temp") // Necessary to work around a Windows bug in Spark 2.0.0; omit if you're not on Windows.
         .config("spark.sql.streaming.checkpointLocation", "file:///C:/checkpoint")
         .getOrCreate()

       setupLogging()
         val userSchema = new StructType().add("name", "string").add("age", "integer")
       // Create a stream of text files dumped into the logs directory
       val rawData =  spark.readStream.option("sep", ",").schema(userSchema).csv("file:///C:/Users/R/Documents/spark-poc-centri/csvFolder")

       // Must import spark.implicits for conversion to DataSet to work!
       import spark.implicits._
      rawData.createOrReplaceTempView("updates")
       val sqlResult= spark.sql("select * from updates")
       println("sql results here")
       sqlResult.show()
       println("Otheres")
       val query = rawData.writeStream.outputMode("append").format("console").start()

       // Keep going until we're stopped.
       query.awaitTermination()

       spark.stop()

    }
 }

在执行期间,我收到以下错误。由于我是流媒体新手,任何人都可以告诉我如何在 spark 结构化流媒体上执行 spark SQL 查询

2018-12-27 16:02:40 INFO  BlockManager:54 - Initialized BlockManager: BlockManagerId(driver, LAPTOP-5IHPFLOD, 6829, None)
2018-12-27 16:02:41 INFO  ContextHandler:781 - Started o.s.j.s.ServletContextHandler@6731787b{/metrics/json,null,AVAILABLE,@Spark}
sql results here
Exception in thread "main" org.apache.spark.sql.AnalysisException: Queries with streaming sources must be executed with writeStream.start();;
FileSource[file:///C:/Users/R/Documents/spark-poc-centri/csvFolder]
    at org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker$.org$apache$spark$sql$catalyst$analysis$UnsupportedOperationChecker$$throwError(UnsupportedOperationChecker.scala:374)
    at org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker$$anonfun$checkForBatch$1.apply(UnsupportedOperationChecker.scala:37)
    at org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker$$anonfun$checkForBatch$1.apply(UnsupportedOperationChecker.scala:35)
    at org.apache.spark.sql.catalyst.trees.TreeNode.foreachUp(TreeNode.scala:127)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$foreachUp$1.apply(TreeNode.scala:126)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$foreachUp$1.apply(TreeNode.scala:126)
    at scala.collection.immutable.List.foreach(List.scala:392)

【问题讨论】:

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


    【解决方案1】:

    你不需要这些行中的任何一行

    import spark.implicits._
    rawData.createOrReplaceTempView("updates")
    val sqlResult= spark.sql("select * from updates")
    println("sql results here")
    sqlResult.show()
    println("Otheres")
    

    最重要的是,不需要select *。打印数据框时,您已经看到了所有列。因此,您也不需要注册临时视图来为其命名。

    当你 format("console") 时,就不需要 .show()


    Refer to the Spark examples 用于从网络套接字读取并输出到控制台。

    val words = // omitted ... some Streaming DataFrame
    
    // Generating a running word count
    val wordCounts = words.groupBy("value").count()
    
    // Start running the query that prints the running counts to the console
    val query = wordCounts.writeStream
      .outputMode("complete")
      .format("console")
      .start()
    
    query.awaitTermination()
    

    带走 - 使用像 .select().groupBy() 这样的 DataFrame 操作,而不是原始 SQL


    或者你可以使用 Spark Streaming,as shown in those examples,你需要在每个流批次上 foreachRDD,然后将它们转换为 DataFrame,你可以查询

    /** Case class for converting RDD to DataFrame */
    case class Record(word: String)
    
    val words = // omitted ... some DStream
    
    // Convert RDDs of the words DStream to DataFrame and run SQL query
    words.foreachRDD { (rdd: RDD[String], time: Time) =>
      // Get the singleton instance of SparkSession
      val spark = SparkSessionSingleton.getInstance(rdd.sparkContext.getConf)
      import spark.implicits._
    
      // Convert RDD[String] to RDD[case class] to DataFrame
      val wordsDataFrame = rdd.map(w => Record(w)).toDF()
    
      // Creates a temporary view using the DataFrame
      wordsDataFrame.createOrReplaceTempView("words")
    
      // Do word count on table using SQL and print it
      val wordCountsDataFrame =
        spark.sql("select word, count(*) as total from words group by word")
      println(s"========= $time =========")
      wordCountsDataFrame.show()
    }
    
    ssc.start()
    ssc.awaitTermination()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 2017-03-29
      • 1970-01-01
      • 2020-07-17
      • 2018-03-14
      • 2021-01-31
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多