scala - 来自值列表的循环数,在 Spark 和 Scala 中是正数和负数的混合

标签 scala hadoop apache-spark bigdata

有一个包含值列表的 RDD,这些值是正值和负值的混合。 需要根据此数据计算周期数。

例如,

val range = List(sampleRange(2020,2030,2040,2050,-1000,-1010,-1020,起点,-1030,2040,-1020,2050,2040,2020,终点, -1060,-1030,-1010)

上面列表中每个值之间的间隔是 1 秒。即,2020 和 2030 以 1 秒为间隔记录,依此类推。

它从负转正并保持正 >= 2 秒的次数。
如果 >= 2 秒,则为一个循环。

周期数:逻辑
示例 1: 列表(1,2,3,4,5,6,-15,-66)
循环次数为1
原因:当我们从列表的第一个元素移动到第 6 个元素时,我们有 5 个间隔,这意味着 5 秒。所以一个循环。 当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数并移动到第 7 个元素。负数只有2个,间隔只有1个,所以不算循环。
示例 2:
列表(11,22,33,-25,-36,-43,20,25,28)
循环次数为3
原因:当我们从列表的第一个元素移动到第三个元素时,我们有 2 个间隔,这意味着 2 秒。所以一个循环 当我们移动到列表的第 4 个元素时,它是一个负值。所以我们从第 4 个元素开始计数,然后移动到第 5、6 个元素。我们有 2 个间隔,这意味着 2 秒。所以一个循环 当我们移动到列表的第 7 个元素时,它是一个正值。所以我们从第 7 个元素开始计数,然后移动到第 8、9 个元素。我们有 2 个间隔,这意味着 2 秒。所以一个循环。

range 是用例中的 RDD。看起来像
scala> 范围
范围:Seq[com.Range] = List(XtreamRange(858,890,899,920,StartEngage,-758,-790,-890,-720,920,940,950))

最佳答案

您可以对此进行编码“有多少次它从负数变为正数并保持正数 >= 2 秒。如果 >= 2 秒则为一个循环。”几乎直接进入与守卫的模式匹配。表达式 if(h < 0 && ht > 0 && hht > 0)检查循环并将结果加一,然后继续列表的其余部分。

def countCycles(xs: List[Int]): Int = xs match {
 case Nil => 0
 case h::ht::hht::t if(h < 0 && ht > 0 && hht > 0) => 1 + countCycles(t)
 case h::t => countCycles(t)
}

scala> countCycles(range)
res7: Int = 1

关于scala - 来自值列表的循环数,在 Spark 和 Scala 中是正数和负数的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219085/

相关文章:

apache-spark - Spark Checkpointing Non-Streaming - 检查点文件可用于后续作业运行或驱动程序

dataframe - Spark 数据帧 : collect () vs select ()

Scala 在编写函数文字时通过下划线部分应用

scala - 匹配 “fallthrough” : executing same piece of code for more than one case class?

sql-server - 如何使用 Slick plain SQL 和 SQL Server 返回自动生成的 ID

xml - 你能用antixml创建xml文档吗?

hadoop - 使用Hadoop工具集匹配地理位置

java - Spark 异常 : Task failed while writing rows

hadoop - 从 pig 放出的负载 hive

scala - Twitter 数据来自 Spark