Spark 2.x管理与开发-Spark Streaming-Spark Streaming进阶(五)【DataFrame和SQL操作】

我们可以很方便地使用DataFrames和SQL操作来处理流数据。

您必须使用当前的StreamingContext对应的SparkContext创建一个SparkSession

此外,必须这样做的另一个原因是使得应用可以在driver程序故障时得以重新启动,这是通过创建一个可以延迟实例化的单例SparkSession来实现的。

在下面的示例中,我们使用DataFrames和SQL来修改之前的wordcount示例并对单词进行计数。

我们将每个RDD转换为DataFrame,并注册为临时视图,然后在这临时视图上执行SQL查询。

  

*******自己操作*******

Scala 代码:

package streamingExamples
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.spark.storage.StorageLevel
import org.apache.spark.sql.SparkSession

object MyNetworkWordCountWithSQL {
  def main(args: Array[String]): Unit = {
    //下面的两行代码定义日志级别,可以减少打印出来的日志
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    //一、创建运行时的环境
    //保证CPU的核数大于等于2,"local[2]"表示开启两个线程
    //一个线程用于读取数据,一个线程用于计算处理数据
    val conf=new SparkConf().setMaster("local[2]").setAppName("MyNetworkWordCountWithSQL")
    //二、定时采样
    //因为SparkStreaming是将连续的数据流变成不连续的RDD,所以就是定时采样。
    //接收两个参数,其中:Seconds(3)是采样时间间隔,这里就是3秒
    val ssc=new StreamingContext(conf,Seconds(3))
    //三、创建DStream,从netcat服务器上读取数据
    //接收三个参数:地址,端口号,和RDD里缓存的位置一致(一般取默认值即可)
    //注意:IP可以不是Active状态主机的IP,只要是集群里的即可
    val lines=ssc.socketTextStream("192.168.212.111", 1234, StorageLevel.MEMORY_ONLY)
    //四、分词
    val words=lines.flatMap(_.split(" "))
    //五、计数
    words.foreachRDD(rdd=>{
      val spark=SparkSession.builder().config(rdd.sparkContext.getConf).getOrCreate()
      //1.将RDD转换成DF
      import spark.implicits._
      val df1=rdd.toDF("word") //df1只有一列RDD
      //2.创建视图
      df1.createOrReplaceTempView("words")
      //3.执行SQL语句
      spark.sql("select word,count(1) from words group by word").show()
    })
    //六、启动StreamingContext进行计算
    ssc.start()
    //七、等待任务结束
    ssc.awaitTermination()
  }
}

结果:

先启动nc服务器:

[root@bigdata111 bin]# nc -l 1234

运行程序:

 

向服务器写入数据:

 

 

 

 

 

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3