IT/Spark

Spark - Spark SQL

물통꿀꿀이 2020. 2. 8. 18:47

이전에도 알아보았지만 구조화된 데이터는 비구조화, 반구조화 데이터보다 확실히 데이터를 분석, 처리하기에 좀 더 효율적이다. 

때문에 RDB와 같은 관계형 데이터베이스를 많이 선택하는 편이다. 그렇다면 Spark는??


일반적인 방법은 Spark pipeline에서 직접 데이터베이스에 Connection을 맺고 사용하는 것이다. 그러나 매우 비효율적이다. 

(데이터베이스 Connection 관리를 추가적으로 해야하는 등 배보다 배꼽이 커질수도..)

Spark Stack

근데 다행하게(?) Spark에서는 Spark Stack 중 Spark SQL을 지원한다.

Spark에서 SQL을 도입한 이유는 여러가지가 있겠지만 SQL를 컴포넌트의 하나로 구성하면서 사용자가 얻을 수 있는 장점은 아래와 같다.

1) RDB 와 같은 구조화된 데이터 처리가 가능해진다.

2) (각 데이터베이스에 대한 최적화가 꾸준히 이루어지기 때문에) 높은 성능을 얻을 수 있다. 

* 생각해보면 RDD를 사용할 땐 최적화를 고민해야 했겠지만, SQL은 그 비중이 낮아질 수 있다.

3) 외부 데이터 베이스 및 반정형화 데이터 구조 또한 사용 할 수 있다.



RDB에서 위 그림을 보면 보통 Table 또는 Relation 이라고 한다. 하지만 Spark SQL에서는 Dataframe 이라고 한다.

(사실 이름만 다를 뿐이지 칼럼, 레코드 등등 개념적인 부분은 거의 흡사하다.)


여기서 잠시!! 그렇다면 Spark의 RDD는 어떻게 된거지 하고 의문을 가질 수도 있다. (분명 RDD가 Spark의 추상화된 데이터 타입인데) 

아래 그림을 확인해보자.


결과적으로 Spark SQL은 RDD를 사용한다. RDD가 가장 Low level의 데이터 타입이기도 하거니와 Spark SQL의 Dataframe은 전체 RDD 레코드의 전체 집합이다. (물론 레코드의 스키마의 정보가 있어야 한다.)


그러면 Spark에서 Dataframe을 만드는 방법에 대해 알아보자. 방법은 2가지로 RDD에서 변경하거나 파일을 읽어서 Dataframe으로 만들 수 있다.

val df = Seq(("one", 1), ("one", 1), ("two", 1))
.toDF("word", "count")
.show
+----+-----+
|word|count|
+----+-----+
| one|    1|
| one|    1|
| two|    1|
+----+-----+

toDF로 RDD로 생성된 데이터를 Dataframe으로 변경하면 위의 결과를 얻을 수 있다.