Hello

02 Scala 함수 모음

|

스칼라 함수 모음

  • mkString() : collection을 출력하기 편하게 변환

01 Scala 기본 문법

|

1. Scala Shell

  • PERL 방식으로 동작

2. 변수 타입과 변수 선언

  • 변수 선언
    • var : 일반 변수
    • val : 상수
  • 변수 타입
    • 변수 타입 생략 가능
    • 변수 타입은 변수명 오른쪽에 선언
    • Byte, Short, Int, Long, Float, Double, Char, Boolean, String

3. Range와 형변환

  • 사용 방법
(1 to 10 by 2).toList
  • 리스트나 배열처럼 보이지만 그냥 Range타입 이다.

4. Class, Object, Companion Object

  • Class
    • 선언 방법
      class a {...}
    
    • Java Class와 다른점
      1. static 키워드를 사용할수 없기에 클래스 내부에 정적 멤버나 함수 선언 불가
      2. setter, getter 자동 생성
      3. 클래스 본문이 생성자가 된다.
      4. 기본 생성자 인자는 클래스명 다음에 기술
  • Object
    • 싱글턴 객체
  • Companion Object
    • 해당 클래스와 똑같은 이름의 객체를 생성한 것이 Companion Object
    • java의 static이 필요한 경우 Companion Object로 대신 할 수 있음
  • 클래스 선언 예제
// 클래스 선언
class MyClass private(var name: String) {
    def sayHello(): Unit = {
        MyClass.sayHello()
    }
}
// 컴패니언 객체 선언
object MyClass {
    def sayHello(): Unit = {
        println("Hello" + new MyClass("sungmin").name)
    }
}

5. Trait, 상속

  • Trait : 자바의 추상클래스와 비슷하지만 다중상속이 허용되는 클래스
  • 상속법 : extends Trait1 with Trait2

6. Apply 함수

  • 객체 이름뒤에 괄호를 넣고 인자값을 넣으면 해당 객체의 apply 메서드 호출로 자동 변환해줌

7. Tuple, Option, Case Class

  • Tuple
    • N개의 데이터 쌍을 저장하는 자료 구조
      // 튜플 생성
      val tuple1 = (1, 2)
      val tuple2 = ("a", 1, "c")
        
      // 튜플 내용 참조
      val n1 = tuple1._2
      val n2 = tuple2._3
    
  • Option
    • N개의 데이터 쌍을 저장하는 자료 구조
    • 튜플과는 달리 값이 있거나 없거나 상관없이 null값을 사용하지 않고 공통된 타입인 Option을 사용할 수 있음
  • Case Class
    • 패턴 매치를 위해 최적화된 클래스
    • case class로 생성하면 companion object, apply, unapply, hashCode, copy, equals, toString 메서드 등이 자동 생성됨

8. Pattern Match

  • 패턴이 매치 되는지 확인하는
  • 사용법
(매치할 변수) match {
    case (...) => ...
    case (...) => ...
}

9. Package Object

  • Common과 같은 공통 클래스를 정의하지 않고도 동일 패키지에서 사용하는 변수나 메서드등을 공유 할수 있음
package org.apache.spark

package object sql {
    type Strategy = SparkStrategy
    type DataFrame = Dataset[Row]
}
  • 위와 같은 소스에서 org.apache.spark 패키지에 있는 모든 클래스에서 sql 이라는 package object에 정의된 메서드나 변수를 사용 할수 있다.

10. Type

  • 새로운 사용자 정의 타입을 선언하는 키워드

11. Import

  • 자바와 비슷하지만, static import의 경우 _를 사용해서 표기
import a.b.c._

12. Function, Method

  • Javascript 처럼 함수를 일반변수처럼 다룰 수 있음

13. Generic

  • <>를 사용하는 자바와 달리 []를 사용
  • 자바와 사용법이나 내용이 많이 다름

14. 암묵적 변환과 타입 클래스 패턴

  • 원래 클래스에는 없는 메서드를 암묵적 변환 방법을 사용해서 타입별로 다르게 구현하여 추가하는 방법
  • 스파크SQL 에서 자주 쓰는 패턴

09 Spark Data Models

|

1. 개요

스파크 데이터 모델이란 스파크에서 데이터를 처리할때 사용하는 데이터 형식으로 Spark 초기 버전의 핵심 데이터 모델인 RDD, 이후 RDD에 스키마정보가 추가되는등 몇몇 부분이 개선된 DataFrame, RDD와 DataFrame의 장점을 취합한 DataSet까지 3가지의 데이터 모델이 존재한다.

데이터 모델 내부적으로 데이터를 변형 가공 할수있는 다양한 메소드를 API로 제공하고 있어 다루기 편리하게 설계되었다.

2. 스파크 데이터 모델 공통 특성

2.1. Transformation API

  • 데이터를 가공해서 동일한 데이터 타입으로 반환하는 연산

2.2. Action API

  • 데이터를 가공해서 가공한 데이터와 다른 데이터 타입으로 반환하는 연산

2.3. 불변성

  • Transformation을 수행한다고 해서 기존의 데이터가 변하는게 아니고 기존의 데이터는 남아있고 새로운 데이터를 생성

2.4. 지연 동작

  • Action 연산이 호출되기 전까지 Transformation 연산은 실제로 수행되지 않음

2.5. 데이터 처리 프로세스

AltText

3. 스파크 데이터 모델별 비교

AltText

3.1. RDD

3.1.1. 특징

  • Spark 0.5 부터 존재
  • SparkContext로부터 생성

3.1.2. 장점

  • 함수형 프로그래밍
  • 타입 안전성

2.1.3. 한계

  • 스키마에 대해서 표현할 방법이 없음

3.2. DataFrame

3.2.1. 특징

  • Spark 1.3 부터 존재
  • 현재는 2.0부터 DataSet에서 흡수, 하위 호환성을 위해 API는 남아있음
  • SparkSession로부터 생성

3.2.2. 장점

  • 스키마가 포함된 관계형 모델(SQL을 이용한 데이터 처리 가능)
  • RDD에 비해 성능상의 이점이 있음(처리 속도, 사용 메모리)

3.2.3. 한계

  • Compile Time에서 타입 안전성을 보장하지 않음

3.3. DataSet

3.3.1. 특징

  • Spark 1.6 부터 존재
  • DataFrame과 RDD의 장점을 모아놓은 상위호환

3.3.2. 장점

  • RDD와 DataFrame이 제공하는 대부분의 기능 지원

3.3.3. 단점

  • 처리해야할 작업의 특성에 따라 RDD연산에 비해 복잡한 코드를 작성해야 하는 경우가 존재
  • 아직 Scala와 Java만 API 지원

3.4. 비교

구분 RDD DataFrame DataSet
성능 비교적 느림 빠름 빠름
메모리 관리 누수 존재 최적화 최적화
Type-safety 보장 보장되지않음 보장
분석확장성 유연함 제한적 유연함

4. 결론

  • RDD, DataFrame, DataSet이 어떤 것인지에 대한 것은 알아둘 필요가 있지만 RDD와 DataFrame의 장점을 포괄하고 있는 DataSet을 사용하는 편이 좋다고 생각된다. 실제 최근에 스파크에 추가된 샘플 코드의 경우는 DataSet을 이용해 처리 하는 경우가 더 많았음

References

08 Spark SQL

|

1. Spark SQL 개요

Spark Session

  • DataFrame, DataSet을 생성하기 위해 사용하는 객체
  • build() 메서드를 통해 인스턴스 생성
  • Spark-shell에서는 spark라는 이름으로 인스턴스가 자동 생성

DataSet

  • Spark SQL에서 사용하는 분산 데이터 모델
  • 기존 DataFrame과 통합되면서 타입/비타입 연산등 다양한 데이터 처리 연산 제공

DataFrame

  • Row 타입의 데이터로 구성된 데이터셋

DataFrameReader

  • SparkSession의 read()메서드를 통해 접근
  • “jdbc”, “json”, “parquet”등 다양한 유형의 데이터소스로부터 데이터프레임을 생성하는 메소드 제공

DataFrameWriter

  • Dataset의 write() 메서드를 통해 접근
  • Dataset의 데이터를 파일시스템, DB등 다양한 저장소에 저장할 떄 사용하는 메서드 제공

Row, Column

  • DataFrame을 구성하는 요소인 row, column을 표현하는 모델이자 API

functions

  • DataFrame을 이용해 데이터를 처리할 떄 사용할 수 있는 각종 함수를 제공하는 Object

StructType, StructField

  • 데이터에 대한 스키마 정보를 나타내는 API
  • StructType : 레코드에 대한 구조정보
  • StructField : 레코드의 필드 정보

GroupedData, GroupedDataSet

  • groupBy() 메서드 등에 의해 그루핑 연산을 수행할 때 사용
  • 집계와 관련된 다양한 연산 제공

References

07 Spark Configuration

|

1. 스파크 프로퍼티

2. 환경 변수

  • JAVA_HOME : 자바 설치 경로
  • PYSPARK_PYTHON : 파이썬 경로(드라이버와 워커 모두에 적용)
  • PYSPARK_DRIVER_PYTHON : 파이썬 경로(드라이버에만 적용)
  • SPARK_DRIVER_R : SparkR 셸이 사용할 R 경로
  • SPARK_LOCAL_IP : 사용할 IP
  • SPARK_PUBLIC_DNS : 애플리케이션 호스트명
  • SPARK_CONF_DIR : 스파크 환경설정 파일 경로

3. 로깅 설정

4. 스케줄링

References