首页 > 解决方案 > 了解 mllib 滑动

问题描述

我知道 Spark Structured Streaming 中的滑动窗口是事件时间的窗口,它具有窗口大小(以秒为单位)和步长(以秒为单位)。

但后来我遇到了这个:

import org.apache.spark.mllib.rdd.RDDFunctions._

sc.parallelize(1 to 100, 10)
  .sliding(3)
  .map(curSlice => (curSlice.sum / curSlice.size))
  .collect()

我不明白这一点。这里没有活动时间,那么做sliding什么呢?

如果我在 .map 行中发表评论,则会得到如下结果:

[I@7b3315a5
[I@8ed9cf
[I@f72203
[I@377008df
[I@540dbda9
[I@22bb5646
[I@1be59f28
[I@2ce45a7b
[I@153d4abb
...

像这样在简单的整数上使用 mllib 的滑动方法是什么意思?Jebrish 的价值观是什么?

标签: scalaapache-sparkmachine-learningapache-spark-mllibsliding-window

解决方案


文档sliding我们可以看到:

通过在它们上传递一个滑动窗口,将其父 RDD 的项目分组到固定大小的块中,从而返回一个 RDD。排序首先基于分区索引,然后是每个分区内项目的排序。[...]

因此,在使用sc.parallelize(1 to 100, 10)顺序的情况下,将是从 1 到 100 的连续数字。

操作的结果sliding是一个Array. 使用 print 将调用该toString对象的方法,但是,Array不会覆盖此方法,而是使用其中定义的方法Objectis TypeName@hexadecimalHash,请参阅如何在不获取“SomeType@2f92e0f4”的情况下打印我的 Java 对象?.

您可以使用map(_.toSeq)将数组转换为Seq将覆盖该toString方法的 a (从而按预期打印列表)。或者您可以使用map(_.mkString(","))将数组转换为字符串。

使用的结果sliding(3)将是(按此固定顺序):

1,2,3
2,3,4
5,6,7
...
97,98,99

推荐阅读