查看
保存数据
| package SparkStreaming.action |
| |
| import org.apache.spark.SparkConf |
| import org.apache.spark.streaming.dstream.DStream |
| import org.apache.spark.streaming.{Milliseconds, StreamingContext} |
| |
| object Action1 { |
| def main(args: Array[String]): Unit = { |
| val sparkConf = new SparkConf().setAppName("action1").setMaster("local[2]") |
| val ssc = new StreamingContext(sparkConf, Milliseconds(3000)) |
| |
| val ds: DStream[String] = ssc.socketTextStream("node1", 44444) |
| |
| |
| ds.filter((line: String) => { |
| val first: Char = line.charAt(0) |
| if (first == 'a') { |
| true |
| } else { |
| false |
| } |
| }).saveAsTextFiles("hdfs://node1:9000/spark", ".txt") |
| |
| |
| ds.filter((line: String) => { |
| val first:Char = line.charAt(0) |
| if(first == 'b'){ |
| true |
| }else{ |
| false |
| } |
| }).saveAsObjectFiles("hdfs://node1:9000/sparkobject",".sequence") |
| |
| ssc.start() |
| ssc.awaitTermination() |
| } |
| } |
foreachRDD算子:常用的一种行动算子
- 遍历DStream中每一个RDD,得到DStream中的每一个RDD,然后对每一个RDD数据保存到MySQL数据库,或者使用SparkSession进行SQL查询分析,因为这个算子是DStream的行动算子,会触发DStream依赖链的执行,但是得到的每一个RDD也必须调用行动算子触发
- 我们可以在foreachRDD算子中,实现对DStream每一批次RDD数据保存操作,保存到数据库、保存到结构化文件中等等,通过还可以在foreachRDD算子中将RDD转换为DataFrame或者Dataset实现结构化数据SQL处理操作
- 【注意问题】如果把数据转换DataFrame或者Dataset保存到数据库,那么我们要求DataFrame、Dataset的Structype中列名必须和数据表的列名字段一致
| package SparkStreaming.action |
| |
| import java.util.Properties |
| |
| import org.apache.spark.SparkConf |
| import org.apache.spark.rdd.RDD |
| import org.apache.spark.sql.{DataFrame, Dataset, SaveMode, SparkSession} |
| import org.apache.spark.streaming.dstream.DStream |
| import org.apache.spark.streaming.{Milliseconds, StreamingContext} |
| |
| object Action2 { |
| def main(args: Array[String]): Unit = { |
| val sparkConf = new SparkConf().setAppName("action2").setMaster("local[2]") |
| val ssc = new StreamingContext(sparkConf, Milliseconds(3000)) |
| |
| val ds: DStream[String] = ssc.socketTextStream("node1", 44444) |
| |
| ds.foreachRDD((rdd: RDD[String]) => { |
| val rdd1 = rdd.map((line: String) => { |
| val array = line.split(" ") |
| (array(0), array(1).toInt) |
| }) |
| val session = SparkSession.builder().config(sparkConf).getOrCreate() |
| import session.implicits._ |
| val frame = rdd1.toDF("name", "age") |
| |
| |
| val properties = new Properties() |
| properties.put("user","root") |
| properties.put("password","Jsq123456...") |
| frame.write.mode(SaveMode.Append).jdbc("jdbc:mysql://node1:3306/project?serverTimezone=UTC", "student_info", properties) |
| }) |
| |
| ssc.start() |
| ssc.awaitTermination() |
| } |
| } |
| 一般情况下 Spark Streaming处理流式数据的时候,如果实时数据是结构化数据类型的话,可以在Spark Streaming中无缝衔接Spark SQL技术对实时的结构化进行统计分析。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?