Spark(五)--Structured Streaming(六) - 有状态算子

目录

6. 有状态算子

6.1 状态

6.2 常规算子

6.2.1 案例

6.2.2 总结

6.3 分组算子

6.3.1 案例

6.3.2 总结


6. 有状态算子

目标

了解常见的 Structured Streaming 算子, 能够完成常见的流式计算需求

步骤

  1. 常规算子

  2. 分组算子

  3. 输出模式

6.1 状态

6.1.1 无状态算子

Spark(五)--Structured Streaming(六) - 有状态算子_第1张图片

无状态

6.1.2 有状态算子

Spark(五)--Structured Streaming(六) - 有状态算子_第2张图片

  • 有中间状态需要保存

  • 增量查询

6.2 常规算子

目标

了解 Structured Streaming 的常规数据处理方式

步骤

  1. 案例

6.2.1 案例

(1)需求

  • 给定电影评分数据集 ratings.dat, 位置在 Spark/Files/Dataset/Ratings/ratings.dat

  • 筛选评分超过三分的电影

  • 以追加模式展示数据, 以流的方式来一批数据处理一批数据, 最终每一批次展示为如下效果

     Spark(五)--Structured Streaming(六) - 有状态算子_第3张图片

(2)步骤

  1. 创建 SparkSession

  2. 读取并处理数据结构

  3. 处理数据

    1. 选择要展示的列

    2. 筛选超过三分的数据

  4. 追加模式展示数据到控制台

(3)代码

读取文件的时候只能读取一个文件夹, 因为是流的操作, 流的场景是源源不断有新的文件读取

val source = spark.readStream
  .textFile("dataset/ratings")
  .map(line => {
    val columns = line.split("::")
    (columns(0).toInt, columns(1).toInt, columns(2).toInt, columns(3).toLong)
  })
  .toDF("UserID", "MovieID", "Rating", "Timestamp")

val result = source.select('Rating, 'MovieID)
    .where('Rating > 3)

6.2.2 总结

针对静态数据集的很多转换算子, 都可以应用在流式的 Dataset 上, 例如 MapFlatMapWhereSelect 等

6.3 分组算子

目标

能够使用分组完成常见需求, 并了解如何扩展行

步骤

  1. 案例

6.3.1 案例

(1)需求

  • 给定电影数据集 movies.dat, 其中三列 MovieIDTitleGenres

  • 统计每个分类下的电影数量

(2)步骤

  1. 创建 SparkSession

  2. 读取数据集, 并组织结构

    注意 Genres 是 genres1|genres2 形式, 需要分解为数组

  3. 使用 explode 函数将数组形式的分类变为单值多条形式

  4. 分组聚合 Genres

  5. 输出结果

(3)代码

val source = spark.readStream
  .textFile("dataset/movies")
  .map(line => {
    val columns = line.split("::")
    (columns(0).toInt, columns(1).toString, columns(2).toString.split("\\|"))
  })
  .toDF("MovieID", "Title", "Genres")

val result = source.select(explode('Genres) as 'Genres)
    .groupBy('Genres)
    .agg(count('Genres) as 'Count)

result.writeStream
  .outputMode(OutputMode.Complete())
  .format("console")
  .queryName("genres_count")
  .start()
  .awaitTermination()

6.3.2 总结

Structured Streaming 不仅支持 groupBy, 还支持 groupByKey

 

你可能感兴趣的:(Spark)