大数据学习之路106-spark streaming统计结果写入mysql

我们首先将数据库的配置信息写到配置文件中。

要使用配置文件的话,首先我们要在pom文件中导入配置文件读取依赖:

 
            com.typesafe
            config
            1.3.3
        

大数据学习之路106-spark streaming统计结果写入mysql_第1张图片

代码如下:

package com.test.sparkStreaming

import java.util.Properties

import com.typesafe.config.{Config, ConfigFactory}
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.sql.catalyst.expressions.Second
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * 将实时词频统计的数据写入mysql数数据库
  */
object MyNetWorkWordCountMysql {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
    //加载配置文件,会去加载resources下面的配置文件,
    // 默认规则:application.conf -> application.json -> application.properties
    val config: Config = ConfigFactory.load()
    //创建Streamingcontext对象
    val conf = new SparkConf().setAppName("MyNetWorkWordCountMysql").setMaster("local[2]")
    //定义一个采样时间,每隔2秒钟采集一次数据,这个时间不能随意设置
    val ssc: StreamingContext = new StreamingContext(conf,Seconds(2))
    //创建一个离散流
    val lines = ssc.socketTextStream("marshal",5678)
     lines.foreachRDD(
       //插入当前批次计算出来的计算结果
       rdd =>{
         //创建一个spark Session对象
         val spark = SparkSession.builder().config(rdd.sparkContext.getConf).getOrCreate()
         //将RDD转换为DataFrame
         import spark.implicits._
         //words是列的名字,表只有一列
         val frame: DataFrame = rdd.flatMap(_.split(" ")).toDF("words")
         //创建临时视图
         frame.createOrReplaceTempView("wordcount")
         //执行sql进行词频统计
         val result: DataFrame = spark.sql("select words,count(*) as total from wordcount group by words")
         //封装用户名和口令
         val props: Properties = new Properties()
         props.setProperty("user",config.getString("db.user"))
         props.setProperty("password",config.getString("db.password"))
         //创建一个mysql数据库连接
        result.write.mode("append").jdbc(config.getString("db.url"),config.getString("db.table"),props)

       }

     )
    ssc.start()
    ssc.awaitTermination()
  }

}

如果运行过程中出现:

Establishing SSL connection without server's identity verification is not re

则改一下配置文件:

db.url = "jdbc:mysql://marshal:3306/lfr?useSSL=false"
db.user = "root"
db.password = "123456"
db.table = "wordcount"

运行结果如下:

大数据学习之路106-spark streaming统计结果写入mysql_第2张图片

我们还可以加一个过滤条件:

 if(!result.rdd.isEmpty())
            result.write.mode("append").jdbc(config.getString("db.url"),config.getString("db.table"),props)

 

你可能感兴趣的:(大数据)