Programming 144

Spark + IntelliJ 프로젝트 구성하기

일단 무작정 스파크를 시작해보자. 목표는 빌드환경 구성을 위해서 sbt를 사용할 것이며 텍스트에디터에 개발을 수행할 수 없으니 IntelliJ로 세팅을 하겠다. 1. 인텔리J에서 프로젝트 구성File -> New -> Project 순으로 메뉴를 선택하면 아래와 같은 화면이 나타난다.당연히 프로젝트는 Scala에 SBT를 선택한다. 2. 프로젝트가 구성되면 build.sbt 파일에 다음과 같이 입력한다.name := "spark-test" version := "1.0" scalaVersion := "2.11.7" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"아직 sbt를 모르지만 간략하게 설명하면 name은 프로젝트 명을 의미하고..

Programming/Spark 2017.02.01

Scala - 패턴 매칭

스칼라는 빌트인 패턴 매칭 메커니즘을 제공한다. 다음 예제는 정수 값에 대한 매치를 수행한 결과이다.def getNumberString(number : Int) : String = number match { case 1 => "one" case 2 => "two" case _ => "many" } println(getNumberString(1)) println(getNumberString(2)) println(getNumberString(3))case문들이 있는 블럭에서 정수값을 문자열로 매핑하는 함수를 정의하고 있다. match 키워드는 객체에 대한 함수를 제공하는 편리한 방법이다.다음은 다양한 타입의 패턴에 대응하는 방법이다.def parseNumber(number : Any) : Any = numb..

Programming/Scala 2016.11.09

Scala - Case 클래스

스칼라는 케이스 클래스 문법을 지원한다. 케이스클래스는 다음과 같은 일반적인 클래스이다.기본적으로 불변이다.패턴 매칭에 따라 분리될 수 있다.레퍼런스 대신 구조적 동일성에 의해 비교된다.간결하게 초기화 되고 사용될 수 있다.예제를 살펴보자. Notification 추상 클래스가 슈퍼클래스와 각 구현 클래스 Email, SMS, VoiceRecording이다.abstract class Notification case class Email(sourceEmail : String, title : String, body : String) extends Notification case class SMS(sourceNumber : String, message : String) extends Notification c..

Programming/Scala 2016.11.08

Scala - 커링

메소드에는 여러개의 파라미터를 정의할 수 있다. 메소드를 호출할때 더 작은 수의 파라미터가 들어오면 메소드는 전달된 수를 기본값으로 하고 그것보다 적은 수의 파라미터를 가진 함수로 표현될 수 있다.object CurryingTest extends App { def modN(n : Int)(x : Int) = x % n def multiply(f : Int => Int, x : Int, y : Int) = f(x) + y println(multiply(modN(2), 10, 4)) }위의 예제를 보자 modN은 두개의 파라미터가 정의된 것 같지만 multiply에서 사용시 한개의 파라미터만 전달되었다. 이 경우 n인자를 디폴트로 전달받은 함수로 인지되어 modN(2)는 multyply의 Int => Int..

Programming/Scala 2016.11.04

Scala - 내포된 함수

스칼라는 NESTED 함수 정의를 지원한다. 다음은 입력된 ArrayBuffer에서 특정값을 필터링하는 예제이다.import scala.collection.mutable.ArrayBuffer object NestedFunctionTest extends App { def filter(list : ArrayBuffer[Int], filterValue : Int) = { def filterInternal(list : ArrayBuffer[Int]) = { val results = ArrayBuffer[Int]() list.foreach(i => if (i != filterValue) results += i) results } filterInternal(list) } println(filter(ArrayBuff..

Programming/Scala 2016.11.02

Scala - 고차함수

스칼라에서는 고차함수 정의를 지원한다. 함수는 다른 함수를 파라미터로 전달받고 그것을 활용할 수 있다. 고차함수를 사용하는 예제는 다음과 같다.(f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, y) * z해당 함수는 함수를 인자로 받고 함수의 결과에 곱하기를 하는 함수이다. 다음은 실제 사용예이다.object HighOrderFunctionTest extends App { val plus = (x : Int, y : Int) => x + y val minus = (x : Int, y : Int) => x - y val multiply = (f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, ..

Programming/Scala 2016.11.02

Scala - 익명 함수

스칼라에서 익명함수를 정의하는 방법은 매우 간단하다. 아래는 가장 간편하게 정의한 예이다. 왼쪽부분은 파라미터를 정의한 부분이고 오른쪽 부분의 수식을 정의한 부분이다.(x: Int) => x + 1위의 익명함수는 사실 아래와 같은 정의를 단순한 한 것이다.new Function1[Int,Int] { override def apply(x: Int): Int = x + 1 }다수의 파라미터의 경우는 아래와 같이 정의한다.(x: Int, y:Int) => x + y파라미터가 없는 경우는 다음과 같다.() => System.getProperty("user.dir")위의 각 함수들을 테스트하면 아래와 같이 수행할 수 있다.object FunctionTest extends App { val plusOne = (x:..

Programming/Scala 2016.11.02

Scala - 믹스인 클래스 컴포지션

단일 상속만을 지원하는 언어들과는 다르게 스칼라는 클래스를 재사용을 위한 다른 개념을 가지고 있다. 새로운 클래스 정의내에 클래스의 정의를 새로운 멤버 정의로 재활용할 수 있다. 이것을 믹스인-클래스 컴포지션이라고 한다.abstract class AbsIterator { type T def hasNext : Boolean def next : T }다음으로는 AbsIterator를 상속한 믹스인 클래스를 고려해보자. 클래스를 믹스인으로 사용될 수 있게 정의하기 위해서 trait 키워드를 활용한다. trait RichIterator extends AbsIterator { def foreach(f : T => Unit) = { while (hasNext) f(next) } }다음은 String의 각 캐릭터를 ..

Programming/Scala 2016.11.01

Scala - 트래잇

트래잇은 자바에서의 인터페이스와 유사하다. 트래잇은 지원해야하는 메소드 시그니처를 명시한다. 자바 8에서처럼 스칼라는 부분적인 구현을 지원한다. 몇몇의 메소드의 기본 구현을 제공할 수 있다는 것을 의미한다. 클래스와는 반대로 생성자 파라미터를 가질 수 없다.trait Similarity { def isSimilar(x : Any) : Boolean def isNotSimilar(x : Any) : Boolean = !isSimilar(x) }두개의 메소드를 가지고 있다. isSimilar는 구현을 제공하지 않고 있지만 isNotSimilar는 구현을 제공한다. 결과적으로 이 트래잇과 결합하는 클래스는 isSimilar에 대한 구현만 하면 된다. 트래잇은 일반적으로 mixin 클래스 컴포지션으로 클래스와 ..

Programming/Scala 2016.11.01

Scala - 클래스

클래스는 객체를 생성하기 위한 정적인 템플릿이다.class Point (var x : Int, var y : Int) { def move(dx : Int, dy : Int): Unit = { x = x + dx y = y + dy } override def toString : String = "(" + x + "," + y + ")" } 스칼라에서 클래스는 생성자 인자로 파라미터를 전달할 수 있다. 위 코드는 두개의 인자를 가진 생성자를 정의를 하고 있다. x 와 y는 클래스의 어디서든 접근을 할 수 있다.클래스는 또란 두개의 메소드를 포함하고 있는데 move 와 toString이다. move는 두개의 정수를 전달받아 x와 y값을 변경하고 리턴은 없다. 여기서 Unit이라는 키워드가 보이는데 자바와 같은..

Programming/Scala 2016.11.01