最近、インターンシップのためにビッグデータに関連する新しいプロジェクトに取り組み始めました。私のマネージャーは関数型プログラミングの学習を始めることを推奨しました(彼らはScalaを強く推奨しました)。私はF#を使ってささやかな経験をしましたが、このプログラミングパラダイムを使用することの重要性を理解できませんでした。
ディーンはこのトピックについて興味深い話をし、ここで「ビッグデータ」を使用する理由についての彼の考えを共有しました:http : //www.youtube.com/watch?v=DFAdLCqDbLQ しかし、ビッグデータは意味がないので、あまり便利ではありませんでしたHadoopのみ。
BigDataは非常にあいまいな概念なので。しばらく忘れます。私は、データを処理するときにさまざまな側面を比較するための1つの簡単な例を考え出して、機能的な方法が高価であるかどうかを確認しました。関数型プログラミングが小さなデータに対して高価でメモリを消費する場合、なぜビッグデータに関数型プログラミングが必要なのですか?
派手なツールから遠く離れて、私は3つのアプローチを使用して1つの特定の人気のある問題の解決策を構築しようとしました:命令的な方法と機能的な方法(再帰、コレクションの使用)。時間と複雑さを比較して、3つのアプローチを比較しました。
Scalaを使用してこれらの関数を記述しました。3つのパラダイムを使用してアルゴリズムを記述するのに最適なツールだからです。
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
}
関数型プログラミングが重いことに気づきました!時間がかかり、メモリ内のより多くのスペースを消費します。記事を読んだりトークを見たりすると、データサイエンスで関数型プログラミングを使用するべきだと彼らは言っています。確かに、それは特にデータの世界では、より簡単で生産的です。しかし、それはより多くの時間とより多くのメモリ空間を必要とします。
では、なぜビッグデータで関数型プログラミングを使用する必要があるのでしょうか。ビッグデータに関数型プログラミング(Scala)を使用するためのベストプラクティスは何ですか?