Spark学习(12)之流式计算SparkStreaming中的sparkSql

该博客展示了如何使用SparkSql处理实时数据流。首先,从socket输入流中创建DStream,然后将其转换为DataFrame并创建视图。接着,通过SparkSession执行SQL查询,对单词进行计数并展示结果。在第二种写法中,先通过reduceByKey计算每个单词的出现次数,再展示结果。
摘要由CSDN通过智能技术生成

我们可以使用sparkSql来计算实时流中离散的RDD,通过把DStream转化成DF, 然后在创建视图,再使用SparkSession执行标准的sql语句就可以。通过下面代码,我们可以发现这里创建DataFrame和以前的稍微有点差别,通过直接给DF指定字段来创建DataFrame的结构,这个指定的字段要和RDD中的结构对应

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.log4j.Logger
import org.apache.log4j.Level
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)
    //获取StreamingContext对象
    val conf=new SparkConf().setAppName("StreamTest2").setMaster("local[2]")
    val ssc=new StreamingContext(conf,Seconds(2))
    //得到DStream,是一个scoket输入流                  ip               端口                     
    val dstream = ssc.socketTextStream("192.168.112.111", 1234, StorageLevel.MEMORY_AND_DISK_SER)
    val pairRdd=dstream.flatMap(_.split(" "))
    pairRdd.foreachRDD(rdd=>{
      //创建sparkSession对象,用来导入隐式转换的,也用它执行sparkSql的标准sql语句
      val spark=SparkSession.builder().appName("SparSqlDemo1").master("local").getOrCreate()
      import spark.implicits._
      //直接通通过word字段创建df
      val df=rdd.toDF("word")
      df.printSchema()
      df.createOrReplaceTempView("mywords")
      spark.sql("select word,count(*) from mywords group by word").show()
    })
    
    //启动流式计算
    ssc.start()
    ssc.awaitTermination()
  }
}

第二种写法,我们稍微通过Reduce计算一下再保存在表中

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.log4j.Logger
import org.apache.log4j.Level
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)
    //获取StreamingContext对象
    val conf=new SparkConf().setAppName("StreamTest2").setMaster("local[2]")
    val ssc=new StreamingContext(conf,Seconds(2))
    //得到DStream,是一个scoket输入流                  ip               端口                     
    val dstream = ssc.socketTextStream("192.168.112.111", 1234, StorageLevel.MEMORY_AND_DISK_SER)
    val pairRdd=dstream.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
    pairRdd.foreachRDD(rdd=>{
      //创建sparkSession对象,用来导入隐式转换的,也用它执行sparkSql的标准sql语句
      val spark=SparkSession.builder().appName("SparSqlDemo1").master("local").getOrCreate()
      import spark.implicits._
      //直接通通过word字段创建df
      val df=rdd.toDF("word","num")
      df.printSchema()
      df.createOrReplaceTempView("mywords")
      //spark.sql("select word,count(*) from mywords group by word").show()
      spark.sql("select word,num from mywords").show()
    })
    
    //启动流式计算
    ssc.start()
    ssc.awaitTermination()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枣泥馅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值