Scala로 WordCount 작업을 실행하기 위해선 코드 작성, 컴파일, 아카이브 생성, 실행이 필요하다.
Scala WordCount 코드
WordCount.scala에 다음과 같이 코드를 작성하였다.
package com.fastcampus.spark
import scala.io.Source
import java.io.PrintWriter
object WordCount {
def main(args: Array[String]): Unit = {
println(">>> WordCountScala...")
var input = args(0)
var output = args(1)
var delimiter = " "
val arr = Source.fromFile(input).getLines().toArray
println(">>> Line Count : " + arr.count(line => true))
val arr2 = arr.flatMap(line => line.split(delimiter))
val arr3 = arr2.map(word => (word, 1))
val arr4 = arr3.groupBy(tuple => tuple._1).toArray
val arr5 = arr4.map(tuple_grouped => (tuple_grouped._1, tuple_grouped._2.map(tuple => tuple._2)))
val arr6 = arr5.map(tuple_grouped => (tuple_grouped._1, tuple_grouped._2.reduce((v1, v2) => v1 + v2)))
val arr7 = arr6.sortBy(tuple => tuple._2)
arr7.foreach(word_count => println(">>> word count (count desc) : " + word_count))
val ordering = new Ordering[(String, Int)] {
override def compare(x: (String, Int), y: (String, Int)): Int = {
if((x._2 compare y._2) == 0) (x._1 compare y._1) else -(x._2 compare y._2)
}
}
val arr8 = arr6.sortBy(tuple => tuple)(ordering)
arr8.foreach(word_count => println(">>> word count (count desc, word asc) : " + word_count))
new PrintWriter(output) {
write(arr8.mkString("\n"))
close()
}
}
}
Scala
복사
컴파일
Scala 컴파일러인 scalac로 코드를 컴파일 하였다.
컴파일 된 class 파일의 위치를 {프로젝트 폴더}/target 폴더로 지정하였다. 컴파일 후 생성된 .class 파일들을 볼 수 있다.
> scalac -d target/ src/main/scala/com/fastcampus/spark/WordCount.scala
> ls -l target/com/fastcampus/spark
-rw-rw-r--. 1 5692 1월 2 16:36 WordCount$$anon$1.class
-rw-rw-r--. 1 1192 1월 2 16:36 WordCount$$anon$2.class
-rw-rw-r--. 1 8534 1월 2 16:36 WordCount$.class
-rw-rw-r--. 1 789 1월 2 16:36 WordCount.class
Bash
복사
JAR 아카이브 생성
생성 된 class 파일들을 JAR 아카이브로 묶어준다.
동일한 target 폴더에 JAR 파일을 저장하기 위해 경로를 지정하였고, 압축 할 class 파일들을 지정하였다.
> jar cvf target/WordCount.jar target/com/fastcampus/spark/*
> ls -l target
-rw-rw-r--. 1 7468 1월 2 16:36 WordCount.jar
drwxrwxr-x. 3 24 1월 2 15:34 com
Bash
복사
실행
scala 명령을 통해 아카이브를 실행한다.
환경변수인 Classpath에 아카이브 경로를 추가해야 하므로, classpath 옵션을 통해 명시해준다. 인자로 입력 파일과 출력 파일의 경로를 함꼐 지정해줌으로써 WordCount 작업을 수행할 수 있다.
> scala -cp target/ com.fastcampus.spark.WordCount /usr/lib/apache-maven-3.8.6/LICENSE ./out.txt
>>> WordCountScala...
>>> Line Count : 351
>>> word count (count desc) : ((an,1)
>>> word count (count desc) : (complies,1)
...
> cat out.txt
(,1480)
(the,99)
(of,64)
(or,62)
...
Bash
복사