Spark Transformation 는 기존의 RDD에서 새로운 RDD를 생성하는 function이다.
Lazy 처리방식이라서 action을 호출할 때 transformation이 실제로 실행된다.
->
transformation을 수행할 때 query plan만 만들고 실제로 메모리에 올리지는 않는다.
action이 호출될 때 transformation을 메모리에 올려서 수행하고 action을 수행시킨다.
transformation 종류
Narrow transformation: 하나의 연산이 수행될 데이터가 하나의 노드에 바로 있어서 수행되는 것
Wide transformation: 연산처리되어야 할 데이터 클러스터 노드 여기저기에 분산되어 있어서 연산처리 수행 시, 메모리 간의 전달량이 많아 지는 것, 네트워크 연산 처리량이 많아짐
Spark RDD Transformation 연산 종류
연산(operation) | 설명 |
---|---|
distinct() | RDD의 distinct 메서드를 호출 |
filter() | SQL의 where절, RDD의 레코드를 모두 확인하고 조건 함수를 만족하는 레코드만 반환 |
map() | 주어진 입력을 원하는 값으로 반환하는 함수를 명시하고 레코드별로 적용 |
flatMap() | 단일 로우를 여러 로우로 변환해야 하는 경우에 사용하는 map의 확장버전 |
sortBy() | RDD를 정렬, 함수를 지정해 RDD의 데이터 객체에서 값을 추출한 다음 값을 기준으로 정렬 |
union() | RDD들의 elements를 합쳐서 새로운 RDD를 만든다. |
join() | 데이터베이스에서 쓰이는 조인개념, 두개의 테이블로 부터 공통된 값을 기준으로 필드를 결합시킨다. |
coalesce(), repartition() | output partition 수 조절할 때사용 coalesce()와 repartition()의 차이는 셔플을 하냐 안하냐 차이인데, coalesce()는 full shuffling을 하지 않고, repartition()은 full shuffling을 한다. |
groupByKey() | 한 쌍의 (K,V) 데이터셋이 있을 때, key K를 기준으로 데이터가 셔플되어서 새로운 RDD를 만든다. |
reduceByKey(func, [numTasks]) | 데이터가 셔플되기전에 같은 머신에 같은 key끼리 결합하여 key별로 count를 한다. |
sortByKey() | 한 쌍의 (K,V) 데이터셋이 있을 때 이 데이터는 key K를 기준으로 정렬되어 새로운 RDD가 된다. |
실제의 데이터를 가지고 작업하고 싶을 때 action이 수행된다.
action을 수행하게되면 rdd는 더이상 rdd가 아닌 non-rdd values로 바뀐다.
action의 값들은 drivers에 저장되거나 외부의 storage system에 저장된다
->
laziness 한 RDD를 실제 동작으로 바꾸게 한다.
연산(operation) | 설명 |
---|---|
count() | RDD전체의 row수를 나타내고 RDD가아닌 int으로 바뀜 |
cellect() | driver program에 RDD전체 데이터를 리턴하고 RDD가 아닌 list로 바뀜 |
take(n) | 지정한 n만큼 RDD의 .요소를 리턴하고,RDD가 아닌 list로 바뀜 |
top(n) | 지정한 n만큼 RDD에서 큰 순서대로 리턴하고 RDD가아닌 list로 바뀜 |
countByValue() | RDD의 value별로 수를 count해서 return해주고 dict로 바뀐다. |
reduce() | RDD의 모든 값을 하나의 값으로 만들 때 사용, RDD가 아닌 다른 타입으로 바뀜 |
fold() | reduce()와 비슷, zero value(0)을 input으로서 사용한다. reduce()와의 가장 큰 차이는 reduce()는 빈 collection에 exception을 던지고 fold()는 빈 collection을 위해 정의되었다. |
aggregate() | input type으로부터 다른 데이터 타입을 얻을 수 있도록 유연성을 제공 |
first() | RDD의 요소중 가장 첫 번째 값을 리턴하고 RDD가 아닌 다른 타입으로 바뀜 |
max(), min() | RDD의 요소중 가장 큰 값, 가장 작은 값을 리턴하고 RDD가 아닌 다른 타입으로 바뀜 |
transformation | action |
---|---|
distinct() | show() |
withColumn() | collect() |
withColumnRenamed() | count() |
filter(), where() | take() |
groupBy() | reduce() |
agg(sum,min,max,count...) | first() |
select() | describe() |
selectExpr() | explain() |
union(),unionAll() | |
sort(), orderBy() | |
drop() |