스파크 2.X부터 스파크 구조 확립을 위한 핵심 개념들을 도입함.
저수준의 RDD API 패턴과 고수준 DSL과 데이터 프레임 API를 사용한 예시 비교
sc = spark.sparkContext
# (name, age) 형태의 튜플로 된 RDD 생성
dataRDD = sc.parallelize([("Brooke", 20), ("Denny", 31), ("Jules", 30), ("TD", 35), ("Brooke", 25)])
# 집계와 평균을 위한 람다 표현식, map, reduceByKey transformation
ageRDD = (dataRDD
.map(lambda x: (x[0], (x[1], 1)))
.reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))
.map(lambda x: (x[0], x[1][0] / x[1][1]))
)
print(ageRDD.collect())
data_df = spark.createDataFrame([("Brooke", 20), ("Denny", 31), ("Jules", 30), ("TD", 35), ("Brooke", 25)], ['name', 'age'])
avg_df = data_df.groupBy('name').agg(avg('age'))
avg_df.show()
⇒ 간단하고, 직관적인 코드 구현이 가능하다.
지원하는 프로그래밍 언어와 맞게 스파크는 기본적인 내부 데이터 타입을 지원함.
스키마(schema) : 데이터 프레임을 위해 칼럼 이름과 연관된 데이터 타입을 정의한 것.
데이터를 읽기 전 스키마를 정의하는 것의 장점
스키마를 정의하는 두 가지 방식
# 프로그래밍 스타일
from pyspark.sql.types import *
schema = StructType([StructField("author", StructType(), False),
StructField("title", StringType(), False),
StructField("pages", IntegerType(), False)])
# DDL 사용
schema = "author STRING, title STRING, pages INT"
칼럼과 표현식
Example 3-6 : 데이터를 생성하고 데이터 프레임으로 정의하는 예제 - 링크
로우(row)
from pyspark.sql import Row
blog_row = Row(6, "Reynold", "Xin", "<https://tinyurl.6>", 255568, "3/2/2015", ["twitter", "LinkedIn"])
blog_row[1]
# 데이터 프레임으로 만들어서 사용
rows = [Row("Matei Zaharia", "CA"),Row("Reynold Xin", "CA")]
authors_df = spark.createDataFrame(rows, ["Authors", "State"])
authors_df.show()
DataFrameReader와 DataFrameWriter