【问题标题】:Spark RDD: filling inregular time seriesSpark RDD:填充不规则时间序列
【发布时间】:2015-10-23 12:58:31
【问题描述】:

所以我有一个带有不规则时间序列数据的 RDD:

1,
4、
6、
..等等

我需要将其填充到常规时间序列中:

1,
2、
3、
4、
5、
6、
..等等

到目前为止,我已经创建了一个具有 1、2、3、4、5、6、.. 的 RDD,然后将其左外连接到原始 RDD,这给了我:

1,
2、
3、
4、
5、
6、
..等等

所以我面临的问题是用前一个非 Null 行中的值填充那些 2,3,5。

我宁愿在 RDD 级别上执行此操作而不使用 sparkSQL,这当然是最后的选择。转到 scala 数组级别并不是很吸引人,因为对于性能问题,我更愿意将其保持在 RDD 级别。

谢谢

【问题讨论】:

  • 去 sparkSQL (...) 当然是最后的选择 - 你能解释一下为什么吗?
  • 当时我仅有的两个解决方案是:a)通过 sparkSQL 的窗口函数; b)火花外的纯scala
  • 基于我之前的Oracle经验的window函数一般是最慢的,所以我猜不这样做的原因纯粹是心理:)
  • 其实这种情况下直觉还不错。只有当您可以提供PARTITION BY 子句时,Spark 窗口函数才能相对较好地执行。在这里,这并非不可能,但远非直截了当,而且不是一项工作就能完成的。

标签: scala apache-spark rdd


【解决方案1】:

没有初始join 的相对简单的解决方案。让我们从虚拟数据和辅助函数开始:

val rdd = sc.parallelize(Seq(
    (3L, 1.0), (1L, 4.0), (5L, 3.6), (7L, 0.2), (8L, 0.0)))

def fillTimePoints(xs: Array[(Long, Double)]) = xs match {
  case Array((xTime, xValue), (yTime, _)) => {
    val diff = yTime - xTime

    if (diff == 0) Seq((xTime, xValue))
    else (xTime, xValue) +: (1 until diff.toInt)
      .map(_.toLong)
      .map(i => (i + xTime, xValue))
  }

  case _ => Seq.empty[(Long, Double)]
}

现在剩下的就是在排序的 RDD 上滑动:

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

rdd.sortBy(_._1).sliding(2).flatMap(fillTimePoints).collect

//  Array[(Long, Double)] = Array((1,4.0), (2,4.0), (3,1.0), 
//    (4,1.0), (5,3.6), (6,3.6), (7,0.2))

注意事项:

  • sliding 是开发人员 API 的一部分。其类中的大多数方法在最近的版本中已被弃用。仍然可以从头开始编写代码,但现在它应该可以工作了,

  • 您可能更喜欢使用RangePartitioner 后跟repartitionAndSortWithinPartitions 而不是排序。然后您可以使用mapPartitions 应用局部滑动,并将preservePartitioning 设置为true,最后填补空白(再次preservePartitioning)。它需要更多的工作,但您会得到使用RangePartitioner 分区的输出,这可能很有用。

【讨论】:

  • 有趣,不知道sliding() 方法。当分区边缘的记录之间存在间隙时会发生什么情况(例如分区 1 的最后一条记录和分区 2 的第一条记录之间有间隙)?
  • @RohanAletty 由于滑动覆盖分区之间的切换,它将被覆盖。您可以通过广播(在此处查看我的答案 stackoverflow.com/a/31686744/1560062stackoverflow.com/a/33072089/1560062)或分区(在此处查看 Daniels 解决方案 stackoverflow.com/a/23436517/1560062)分两步手动执行类似操作。
  • 极好的解决方案,非常感谢。不知道滑动窗口功能,当然对时间序列非常有价值!
猜你喜欢
  • 2011-06-29
  • 2011-04-23
  • 2016-04-07
  • 2014-09-02
  • 2012-05-12
  • 2015-10-21
  • 2011-06-16
  • 2013-11-07
  • 2023-01-20
相关资源
最近更新 更多