Spark 2.x管理与开发-Spark Streaming-Spark Streaming进阶(五)【DataFrame和SQL操作】
Posted on 2020-08-06 23:32 MissRong 阅读(202) 评论(0) 收藏 举报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
运行程序:

向服务器写入数据:



浙公网安备 33010602011771号