ฉันเริ่มทำงานในโครงการใหม่ที่เกี่ยวข้องกับ Big Data สำหรับการฝึกงานของฉัน ผู้จัดการของฉันแนะนำให้เริ่มการเรียนรู้การเขียนโปรแกรมฟังก์ชั่น (พวกเขาขอแนะนำสกาล่า) ฉันมีประสบการณ์ที่ต่ำต้อยโดยใช้ F # แต่ฉันไม่เห็นความสำคัญของการใช้กระบวนทัศน์การเขียนโปรแกรมนี้เนื่องจากมีราคาแพงในบางกรณี
คณบดีพูดคุยเกี่ยวกับหัวข้อนี้ที่น่าสนใจและแบ่งปันความคิดของเขาว่าทำไม "Big Data" ที่นี่: http://www.youtube.com/watch?v=DFAdLCqDbLQ แต่มันไม่สะดวกเพราะ Big Data ไม่ได้แปล Hadoop เท่านั้น
ในฐานะที่เป็น BigData แนวคิดที่คลุมเครือมาก ฉันลืมไปซักพักแล้ว ฉันพยายามหาตัวอย่างง่ายๆหนึ่งตัวอย่างเพื่อเปรียบเทียบระหว่างแง่มุมต่าง ๆ เมื่อเราจัดการกับข้อมูลเพื่อดูว่าวิธีการใช้งานมีราคาแพงหรือไม่ หากการเขียนโปรแกรมเชิงฟังก์ชั่นมีราคาแพงและใช้หน่วยความจำสำหรับข้อมูลขนาดเล็กทำไมเราต้องใช้กับ Big Data?
นอกเหนือจากเครื่องมือแฟนซีฉันพยายามสร้างวิธีแก้ปัญหาสำหรับปัญหาเฉพาะและเป็นที่นิยมโดยใช้สามวิธีคือวิธีที่จำเป็นและวิธีการใช้งาน (การเรียกซ้ำโดยใช้คอลเลกชัน) ฉันเปรียบเทียบเวลาและความซับซ้อนเพื่อเปรียบเทียบระหว่างสามแนวทาง
ฉันใช้ Scala เพื่อเขียนฟังก์ชันเหล่านี้เนื่องจากเป็นเครื่องมือที่ดีที่สุดในการเขียนอัลกอริทึมโดยใช้กระบวนทัศน์สามแบบ
def main(args: Array[String]) {
val start = System.currentTimeMillis()
// Fibonacci_P
val s = Fibonacci_P(400000000)
val end = System.currentTimeMillis()
println("Functional way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s, end - start))
val start2 = System.currentTimeMillis()
// Fibonacci_I
val s2 = Fibonacci_I(40000000 0)
val end2 = System.currentTimeMillis();
println("Imperative way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s2, end2 - start2))
}
วิธีการทำงาน:
def Fibonacci_P(max: BigInt): BigInt = {
//http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream
//lazy val Fibonaccis: Stream[Long] = 0 #:: 1 #:: Fibonaccis.zip(Fibonaccis.tail).map { case (a, b) => a + b }
lazy val fibs: Stream[BigInt] = BigInt(0)#::BigInt(1)#::fibs.zip(fibs.tail).map {
n = > n._1 + n._2
}
// println(fibs.takeWhile(p => p < max).toList)
fibs.takeWhile(p = > p < max).foldLeft(BigInt(0))(_ + _)
}
วิธีแบบเรียกซ้ำ:
def Fibonacci_R(n: Int): BigInt = n match {
case 1 | 2 = > 1
case _ = > Fibonacci_R(n - 1) + Fibonacci_R(n - 2)
}
วิธีที่จำเป็น:
def Fibonacci_I(max: BigInt): BigInt = {
var first_element: BigInt = 0
var second_element: BigInt = 1
var sum: BigInt = 0
while (second_element < max) {
sum += second_element
second_element = first_element + second_element
first_element = second_element - first_element
}
//Return
sum
}
ฉันสังเกตเห็นว่าการเขียนโปรแกรมฟังก์ชั่นหนัก! ใช้เวลานานและใช้พื้นที่ในหน่วยความจำมากขึ้น ฉันสับสนเมื่อใดก็ตามที่ฉันอ่านบทความหรือดูการพูดคุยพวกเขาบอกว่าเราควรใช้การเขียนโปรแกรมการทำงานในด้านวิทยาศาสตร์ข้อมูล จริงมันง่ายขึ้นและมีประสิทธิภาพมากขึ้นโดยเฉพาะในโลกของข้อมูล แต่มันต้องใช้เวลามากขึ้นและใช้พื้นที่หน่วยความจำมากขึ้น
ดังนั้นทำไมเราต้องใช้ฟังก์ชั่นการเขียนโปรแกรมใน Big Data? แนวทางปฏิบัติที่ดีที่สุดในการใช้ฟังก์ชั่นการเขียนโปรแกรม (Scala) สำหรับ Big Data คืออะไร?