[Spark] Spark Streaming 피보나치 수열 예제

Woong·2021년 12월 9일
0

Apache Spark

목록 보기
2/22
  • 소스코드 출처 : O'REILLY 스파크를 활용한 실시간 처리

상태 기반 피보나치 원소 연산

scala> val ints = Stream.from(0)
ints: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> val fibs = (ints.scanLeft((0,1)) { 
     | case ((previous, current), index) => (current, (previous + current)) 
     | })
fibs: scala.collection.immutable.Stream[(Int, Int)] = Stream((0,1), ?)

scala> fibs.take(8).print
(0,1), (1,1), (1,2), (2,3), (3,5), (5,8), (8,13), (13,21), empty
scala> 

scala> fibs.map{ case (x, y) => x}.take(8).print
0, 1, 1, 2, 3, 5, 8, 13, empty
  • n번째 요소를 얻기 위해 n-1 번째 요소를 처리

비상태 기반 피보나치 원소 연산

scala> import scala.math.{pow, sqrt}
import scala.math.{pow, sqrt}

scala> val phi = (sqrt(5)+1) / 2
phi: Double = 1.618033988749895

scala> def fibonacchiNumber(x: Int): Int = 
     | ((pow(phi,x) - pow(-phi, -x))/sqrt(5)).toInt
fibonacchiNumber: (x: Int)Int

scala> val integers = Stream.from(0)
integers: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> integers.take(10).print
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, empty

scala> val fibonacciSequence = integers.map(fibonacchiNumber)
fibonacciSequence: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> fibonacciSequence.take(8).print
0, 1, 1, 2, 3, 5, 8, 13, empty
scala> 
  • 비네 공식 (Binet formula) 를 이용하여 이전 요소를 구하지 않고 직접 계산
    • -> 스트림의 상태를 알 필요가 없음

0개의 댓글