我知道在Spark结构化流中,滑动窗口是基于事件时间的窗口,它具有窗口大小(以秒为单位)和步长大小(以秒为单位)。
但是后来我遇到了这个:
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的sliding
方法在简单整数上是做什么的?那些乱码值又是什么意思?
回答:
在sliding
的文档中我们可以看到:
通过在父RDD上滑动窗口,按固定大小块分组项目返回一个RDD。排序首先基于分区索引,然后是每个分区内项目的排序。[…]
所以在使用sc.parallelize(1 to 100, 10)
的情况下,顺序将是1到100的连续数字。
sliding
操作的结果是一个Array
。使用print会调用对象的toString
方法,但是Array
并没有重写这个方法,而是使用Object
中定义的方法,即TypeName@hexadecimalHash
,参见如何打印我的Java对象而不得到”SomeType@2f92e0f4″?。
你可以使用map(_.toSeq)
将数组转换为一个Seq
,它会重写toString
方法(因此会按预期打印列表)。或者你可以使用map(_.mkString(","))
将数组转换为字符串。
使用sliding(3)
的结果将是(按此固定顺序):
1,2,32,3,45,6,7...97,98,99