[我知道,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的滑动方法是什么意思?那些犹太人价值观是什么?
在documentation的sliding
中,我们可以看到:
通过在其上传递滑动窗口,从固定大小的块中将其父RDD的项目分组返回RDD。排序首先基于分区索引,然后基于每个分区中的项目排序。 [...]
因此,在使用sc.parallelize(1 to 100, 10)
的情况下,顺序将是从1到100的连续数字。
sliding
操作的结果是Array
。使用print将调用对象的toString
方法,但是Array
不会覆盖此方法,而是将使用Object
中定义的方法,即TypeName@hexadecimalHash
,请参见How do I print my Java object without getting "SomeType@2f92e0f4"?。
您可以使用map(_.toSeq)
将数组转换为Seq
,这将覆盖toString
方法(从而按预期方式打印列表)。或者,您也可以使用map(_.mkString(","))
将数组转换为字符串。
使用sliding(3)
的结果将是(按此固定顺序:]
1,2,3
2,3,4
5,6,7
...
97,98,99