SparkStreaming版本的wordcount(updatestateByKey)保存在mysql

 
 
  1. package sparkstreamday01.SparkStream
  2. import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
  3. import org.apache.log4j.{Level, Logger}
  4. import org.apache.spark.SparkConf
  5. import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
  6. import org.apache.spark.streaming.{Seconds, StreamingContext}
  7. object UpdateKey2Mysql {
  8. //设置日志级别
  9. Logger.getLogger("org").setLevel(Level.WARN)
  10. //设置一个函数
  11. val upFunc = (newWord: Seq[Int], exsits: Option[Int]) => {
  12. val i: Int = newWord.sum + exsits.getOrElse(0)
  13. Some(i)
  14. }
  15. def main(args: Array[String]): Unit = {
  16. //本地运行设置
  17. val conf: SparkConf = new SparkConf()
  18. .setMaster("local[5]")
  19. .setAppName(this.getClass.getSimpleName)
  20. //StreamingContext
  21. val ssc: StreamingContext = new StreamingContext(conf, Seconds(5))
  22. //设置检查点
  23. ssc.checkpoint("up")
  24. //创建socket 接受信息
  25. val text: ReceiverInputDStream[String] = ssc.socketTextStream("Linux00", 9999)
  26. val result: DStream[(String, Int)] = text.flatMap(_.split(" ")).map((_, 1)).updateStateByKey(upFunc)
  27. result.print()
  28. result.foreachRDD(rdd => {
  29. rdd.foreachPartition(p => {
  30. 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")
  31. val statement: PreparedStatement = conn.prepareStatement("create table if not exists wordcount4 (word varchar(20),total int)")
  32. statement.executeUpdate()
  33. p.foreach(t => {
  34. //如果插入的单词已经存在数据库中,则更新这个单词的值(当前出现的次数+数据库当前的次数)
  35. val statement1: PreparedStatement = conn.prepareStatement("select * from wordcount4 where word=?")
  36. statement1.setString(1, t._1)
  37. val set: ResultSet = statement1.executeQuery()
  38. if (set.next()) {
  39. val count: Int = set.getInt("total")
  40. val newcount: Int = count + t._2
  41. //更新
  42. val statement2: PreparedStatement = conn.prepareStatement("update wordcount4 set total=? where word=?")
  43. statement2.setInt(1, newcount)
  44. statement2.setString(2, t._1)
  45. statement2.executeUpdate()
  46. } else {
  47. val statement3: PreparedStatement = conn.prepareStatement("insert into wordcount4 values(?,?)")
  48. statement3.setString(1, t._1)
  49. statement3.setInt(2, t._2)
  50. statement3.executeUpdate()
  51. }
  52. })
  53. conn.close()
  54. })
  55. })
  56. ssc.start()
  57. ssc.awaitTermination()
  58. }
  59. }

猜你喜欢

转载自blog.csdn.net/weixin_40155674/article/details/80709159