【问题标题】:Understanding mllib sliding了解 mllib 滑动
【发布时间】:2020-03-22 10:20:38
【问题描述】:

我知道 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 的价值观是什么?

【问题讨论】:

    标签: scala apache-spark machine-learning apache-spark-mllib sliding-window


    【解决方案1】:

    documentationsliding 我们可以看到:

    通过在其上传递一个滑动窗口,将其父 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
    

    【讨论】:

    • 我了解“SomeType@2f92e0f4”的解释,但不了解滑动窗口。我了解Structrued Streamingn中的滑动窗口是什么,它意味着每次处理一个窗口时,窗口定义了作业的频率以及您要处理的数据。所以在这里滑动只是对数据进行分组?组什么?顺便说一句,当我运行此代码时,它会在新行中打印每个数字,而不是分组。
    • @Alon:在非流式应用程序中,您将只有一个数据帧/RDD - 没有频率的概念,因为不会有任何新数据。此处滑动相当于sliding in scala:它将数据分组到大小相等的数组中。只要收集后不将结果展平,那么您应该有数据组。尝试使用我上面提到的字符串转换方法并查看结果。 (请注意,我更正了答案中的结果部分)。
    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2017-04-13
    • 2016-01-24
    • 2010-10-01
    • 2014-09-19
    • 1970-01-01
    相关资源
    最近更新 更多