Scala 如何在zeppelin中使用Spark sql查询Spark StreamingContext?

Scala 如何在zeppelin中使用Spark sql查询Spark StreamingContext?,scala,apache-kafka,apache-spark-sql,spark-streaming,apache-zeppelin,Scala,Apache Kafka,Apache Spark Sql,Spark Streaming,Apache Zeppelin,我试图使用spark sql查询来自kafka的数据,使用齐柏林飞艇进行实时趋势分析,但没有成功 下面是我在齐柏林飞艇上运行的简单代码片段 //Load Dependency %dep z.reset() z.addRepo("Spark Packages Repo").url("http://repo1.maven.org/maven2/") z.load("org.apache.spark:spark-streaming-kafka-0-8_2.11:2.0.1")

我试图使用spark sql查询来自kafka的数据,使用齐柏林飞艇进行实时趋势分析,但没有成功

下面是我在齐柏林飞艇上运行的简单代码片段

//Load Dependency
%dep 
    z.reset()
    z.addRepo("Spark Packages Repo").url("http://repo1.maven.org/maven2/")
    z.load("org.apache.spark:spark-streaming-kafka-0-8_2.11:2.0.1")
    z.load("org.apache.spark:spark-core_2.11:2.0.1")
    z.load("org.apache.spark:spark-sql_2.11:2.0.1")
    z.load("org.apache.spark:spark-streaming_2.11:2.0.1"

//simple streaming 
%spark
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.kafka.KafkaUtils
import _root_.kafka.serializer.StringDecoder
import org.apache.spark.sql.SparkSession

val conf = new SparkConf()
    .setAppName("clickstream")
    .setMaster("local[*]")
    .set("spark.streaming.stopGracefullyOnShutdown", "true")
    .set("spark.driver.allowMultipleContexts","true")


val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config(conf)
  .getOrCreate()

val ssc = new StreamingContext(conf, Seconds(1))

val topicsSet = Set("timer")
val kafkaParams = Map[String, String]("metadata.broker.list" -> "192.168.25.1:9091,192.168.25.1:9092,192.168.25.1:9093")

val lines = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
                                   ssc, kafkaParams, topicsSet).map(_._2)

lines.window(Seconds(60)).foreachRDD{ rdd =>
    val clickDF = spark.read.json(rdd) //doesn't have to be json
    clickDF.createOrReplaceTempView("testjson1")
    //olderway
    //clickDF.registerTempTable("testjson2")
    clickDF.show

}

lines.print()
ssc.start()
ssc.awaitTermination()
我可以打印每个kafka消息,但当我从testjson1//或testjson2运行简单的sql%sql select*时,我会出现以下错误

java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:347)
at scala.None$.get(Option.scala:345)
at org.apache.spark.storage.BlockInfoManager.releaseAllLocksForTask(BlockInfoManager.scala:343)
at org.apache.spark.storage.BlockManager.releaseAllLocksForTask(BlockManager.scala:646)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
在流媒体中,数据是以twitter为例进行查询的。所以我认为卡夫卡流媒体应该是可能的。所以我想,也许,我做错了什么,或者遗漏了什么


欢迎您提供任何想法、建议和建议

错误消息不会表明缺少临时视图。错误消息表明,类型None不提供名为“get”的元素

使用spark,在调用操作时执行基于RDD的计算。因此,在创建临时表之前,不会执行任何计算。在表上执行查询时,将执行所有计算。如果您的表不存在,您将收到另一条错误消息

也许可以打印Kafka消息,但您的异常告诉您,None实例不知道“get”。因此,我相信源JSON数据包含没有数据的项,这些项由None表示,因此在spark执行计算时会导致执行选项


我建议您通过测试您的解决方案是否适用于不包含空JSON元素的示例数据来验证您的解决方案是否正常工作。

原始版本使用rdd.toDf.RegisterEmptable。。。而不是createOrReplaceTempView。。。。你试过老办法吗?我还想知道-如果有几个rdd要处理,那么最后一个rdd将仅可用于select,因为每个rdd处理结果都会覆盖以前的结果-对吗?我尝试了两种方法。。。但是没有人创建要查询的临时视图。