brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Sep 30. 2020

PySaprk:DataFrame(3)

#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 구문으로 변환해보는 일을 해보자.

작가의 이전글 PySaprk:DataFrame(2)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari