#Spark #PySpark #Join #데이터처리
Join을 하려고하는데.
뭘? 어떻게? 왜? 해야할까.
데이터베이스를 배우면
테이블 구조설계를 먼저 시작하는데
이때
'마스터 테이블' 이라는 용어를 만나게됨.
이게 무엇이고.
좀 더 쉽게 풀어보자면
OOP 구조로 보자면
마스터테이블이 부모, 관련된 다른 테이블이 자식
관계를 갖게되지.
직접 간단한 데이터를 만들어보자.
Code 01.
exam_child_data = [
('A0001', 'David', 33),
('A0001', 'Yarn', 99),
('A1001', 'Markos', 77),
('A0002', 'Sik', 34),
('A0003', 'Luna', 22),
('A0011', 'Max', 45),
('A0021', 'Teddy', 27),
('A0101', 'Mark', 45),
('A0201', 'Sane', 19),
('A1001', 'Son', 28),
('A9001', 'Girl', 18),
('A0021', 'Alonso', 22)]
exam_child_data_schema = StructType([
StructField('CODE', StringType(), True),
StructField('NAME', StringType(), True),
StructField('AGE', IntegerType(), True)
])
exam_child_dataframe = spark.createDataFrame(exam_child_data, exam_child_data_schema)
이전에 만들었던 데이터(exam_dataframe)의 CODE 컬럼을 공유하고 있음.
NAME 컬럼과 AGE 컬럼이 추가됨.
포인트는 '공유'하고 있는 컬럼이지.
여기서 이런 질문을 해볼 수 있어.
CODE 컬럼의 값이 'A1001' 제품을 구매한 사용자는 누구인가?
그 사용자들의 나이는 어떠한가?
이를 알기위해서 Join을 사용해야 할 때야.
Ref: https://brunch.co.kr/@yysttong/60
Code 02.
exam_child_dataframe.join(exam_dataframe, on='CODE', how='inner').show()
직접 보니.
별것없다.
CODE 컬럼이 같은 데이터들이 하나의 Row로 나타난다.
그럼 CODE 컬럼의 값이 'A1001' 인 상품을 구매한 사용자는?
Code 03.
exam_child_dataframe.filter(col('CODE') == 'A1001'). \
join(exam_dataframe, on='CODE', how='inner'). \
select(col('CODE'), col('NAME'), col('AGE')).show()
여기서 중요한 점은,
어디서 filter 함수를 사용하느냐. 를 결정하는 것!
PySpark를 통해서 데이터 전/후처리를 할 때!
꼭 기억해야 할 것이 바로!!
filter를 먼저, 자주 사용하라!!!
위에 보여지는 결과에서 AGE 컬럼의 평균을 구해보려고함.
filter 함수를 제외시키고,
각 CODE 컬럼 별로 몇 명이 있고, 평균 나이는 어떤지 구해보자.
Code 04.
exam_child_dataframe. \
join(exam_dataframe, on='CODE', how='inner'). \
groupBy(col('CODE')).agg(count('NAME').alias('USER_COUNT'), avg(col('AGE')).alias('USER_AGE_AVG')).show()
음... 데충 만들었던 데이터인지라...
결과도 좀 데충(?)같이 보임.
더 자세한 join 관련 세부사항은 API DOCS를 꼭! 확인해야함.
다음엔 실제 SQL 구문으로 변환해보는 일을 해보자.