值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数

Posted

技术标签:

【中文标题】值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数【英文标题】:Number of Cycles from list of values, which are mix of positives and negatives in Spark and Scala 【发布时间】:2016-08-30 05:03:46 【问题描述】:

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

例如,

val range = List(sampleRange(2020,2030,2040,2050,-1000,-1010,-1020,Starting point,-1030,2040,-1020,2050,2040,2020,end point,-1060,-1030,-1010)

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

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

循环数:逻辑示例 1: List(1,2,3,4,5,6,-15,-66) 周期数为 1。 原因:当我们从列表的第 1 个元素移动到第 6 个元素时,我们有 5 个间隔,这意味着 5 秒。就这样一个循环。 当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数,然后移到第 7 个元素。负值只有 2,interval 也只有 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))

【问题讨论】:

看来这里应该是 on cycle 吧-1020,2050,2040,2020, ? 它是一个示例数据。列表中的值是随机的,没有这样的模式。 val 范围 = 列表(17850,17860,17859,17870,-17860,-17859,-17870,2020,2030,2040,2050,-1000,-1010,-1020,-1030,2040,-1020,2050,2040 ,2020,-1060,-1030,-1010) 一个循环是否总是被定义为两秒为正?或者这可能会有所不同? 另外,在您的实际用例中,rangeRDD,对吧?不是List?这可能会改变事情 循环数:逻辑示例 1:List(1,2,3,4,5,6,-15,-66) 循环数为 1。原因:当我们从第一个开始移动时列表的元素到第 6 个元素,我们有 5 个间隔,这意味着 5 秒。就这样一个循环。当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数,然后移到第 7 个元素。负数只有2,interval只有1,所以不算循环。 【参考方案1】:

您可以将此编码为“从负数变为正数并保持正数 >= 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

【讨论】:

【参考方案2】:

单排

range.sliding(3).countcase f::s::t::Nil => f < 0 && s > 0 && t > 0

这会生成所有长度为 3 的子序列,并计算 -ve、+ve、+ve 的数量

概括周期长度

def countCycles(n:Int, xs:List[Int]) = xs.sliding(n+1)
                                         .count(ys => ys.head < 0 && ys.tail.forall(_ > 0))

【讨论】:

【参考方案3】:

以下代码将帮助您解决查询。

object CycleCheck 
   def main(args: Array[String]) 
     var data3 = List(1, 4, 82, -2, -12, "startingpoint", -9, 32, 76,45, -98, 76, "Endpoint", -24)
     var data2 = data3.map(x => getInteger(x)).filter(_ != "unknown").map(_.toString.toInt)
     println(data2)
     var nCycle = findNCycle(data2)
     println(nCycle)
   

   def getInteger(obj: Any) = obj match 
     case n: Int => obj
     case _     => "unknown"

   
def findNCycle(obj: List[Int]) : Int = 
 var cycleCount =0
 var sign = ""
 var signCheck="+"
 var size = obj.size - 1
 var numberOfCycles=0
 var i=0
 for( x <- obj)
   if (x < 0)
     sign="-"
   
   else if (x > 0)
     sign="+"
    

  if(signCheck.equals(sign))
        cycleCount=cycleCount+1

  if(!signCheck.equals(sign) && cycleCount>1)
       cycleCount = 1
       numberOfCycles=numberOfCycles+1
      
  if(size==i && cycleCount>1)
      numberOfCycles= numberOfCycles+1


 if(cycleCount==1)
      signCheck = sign;

  i=i+1
 

  return numberOfCycles  

【讨论】:

以上是关于值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数的主要内容,如果未能解决你的问题,请参考以下文章

scala spark减少groupby中的列表

具有未知循环数的 Scala 未来

在 Scala 中从对象列表创建 HashMap 而无需循环

Scala(Spark)连接数据框中的列[重复]

将数据转换为 spark scala 中的类对象列表

通过Map Spark Scala循环