[HADOOP] 스파크 및 스칼라에서 양수와 음수가 혼합 된 값 목록의 사이클 수
HADOOP스파크 및 스칼라에서 양수와 음수가 혼합 된 값 목록의 사이클 수
값 목록이 포함 된 RDD에 양수와 음수가 혼합되어 있습니다. 이 데이터에서 사이클 수를 계산해야합니다.
예를 들어
val 범위 = 목록 -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 초를 가졌습니다. 그래서 한주 기.
범위는 사용 사례에서 RDD입니다. 마치 스칼라> 범위 범위 : Seq [com.Range] = 목록 (XtreamRange (858,890,899,920, StartEngage, -758, -790, -890, -720,920,940,950))
해결법
-
==============================
1."음에서 양으로 바뀌고> = 2 초 동안 양을 유지하는 횟수를이 코드로 인코딩 할 수 있습니다.> = 2 초이면 사이클입니다." 가드와 패턴 일치에 거의 직접. if (h <0 && ht> 0 && hht> 0) 식은주기를 확인하고 결과에 1을 더한 다음 나머지리스트를 계속합니다.
"음에서 양으로 바뀌고> = 2 초 동안 양을 유지하는 횟수를이 코드로 인코딩 할 수 있습니다.> = 2 초이면 사이클입니다." 가드와 패턴 일치에 거의 직접. if (h <0 && ht> 0 && hht> 0) 식은주기를 확인하고 결과에 1을 더한 다음 나머지리스트를 계속합니다.
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).count{case 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
} }
from https://stackoverflow.com/questions/39219085/number-of-cycles-from-list-of-values-which-are-mix-of-positives-and-negatives-i by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 둘 이상의 열에 의해 클러스터 된 (0) | 2019.09.14 |
---|---|
[HADOOP] Impala SQL에 While 루프를 작성 하시겠습니까? (0) | 2019.09.14 |
[HADOOP] 30 개의 가장 빈번한 단어에서 내림차순으로 정렬하는 방법은 무엇입니까? (0) | 2019.09.13 |
[HADOOP] 원사 API는 elapsedTime으로 응용 프로그램을 가져옵니다 (0) | 2019.09.13 |
[HADOOP] java.lang.Exception : java.lang.NoClassDefFoundError : org / apache / lucene / util / OpenBitSet (0) | 2019.09.12 |