- package sparkstreamday01.SparkStream
- import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
- import org.apache.log4j.{Level, Logger}
- import org.apache.spark.SparkConf
- import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
- import org.apache.spark.streaming.{Seconds, StreamingContext}
- object UpdateKey2Mysql {
- //设置日志级别
- Logger.getLogger("org").setLevel(Level.WARN)
- //设置一个函数
- val upFunc = (newWord: Seq[Int], exsits: Option[Int]) => {
- val i: Int = newWord.sum + exsits.getOrElse(0)
- Some(i)
- }
- def main(args: Array[String]): Unit = {
- //本地运行设置
- val conf: SparkConf = new SparkConf()
- .setMaster("local[5]")
- .setAppName(this.getClass.getSimpleName)
- //StreamingContext
- val ssc: StreamingContext = new StreamingContext(conf, Seconds(5))
- //设置检查点
- ssc.checkpoint("up")
- //创建socket 接受信息
- val text: ReceiverInputDStream[String] = ssc.socketTextStream("Linux00", 9999)
- val result: DStream[(String, Int)] = text.flatMap(_.split(" ")).map((_, 1)).updateStateByKey(upFunc)
- result.print()
- result.foreachRDD(rdd => {
- rdd.foreachPartition(p => {
- val conn: Connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/wjy1?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false&useSSL=true", "wjy1", "351991")
- val statement: PreparedStatement = conn.prepareStatement("create table if not exists wordcount4 (word varchar(20),total int)")
- statement.executeUpdate()
- p.foreach(t => {
- //如果插入的单词已经存在数据库中,则更新这个单词的值(当前出现的次数+数据库当前的次数)
- val statement1: PreparedStatement = conn.prepareStatement("select * from wordcount4 where word=?")
- statement1.setString(1, t._1)
- val set: ResultSet = statement1.executeQuery()
- if (set.next()) {
- val count: Int = set.getInt("total")
- val newcount: Int = count + t._2
- //更新
- val statement2: PreparedStatement = conn.prepareStatement("update wordcount4 set total=? where word=?")
- statement2.setInt(1, newcount)
- statement2.setString(2, t._1)
- statement2.executeUpdate()
- } else {
- val statement3: PreparedStatement = conn.prepareStatement("insert into wordcount4 values(?,?)")
- statement3.setString(1, t._1)
- statement3.setInt(2, t._2)
- statement3.executeUpdate()
- }
- })
- conn.close()
- })
- })
- ssc.start()
- ssc.awaitTermination()
- }
- }
SparkStreaming版本的wordcount(updatestateByKey)保存在mysql
猜你喜欢
转载自blog.csdn.net/weixin_40155674/article/details/80709159
今日推荐
周排行