D-60-데이터분석

박초화·2024년 3월 4일
0
from pyspark.sql import functions as F
from pyspark.sql import Window as W
(
    df
    .withColumn(
        "CategoryName_cnt",
        F.size(
            F.collect_set("CategoryName").over(W.partitionBy("Category"))
        )
    )
    .filter(F.col("CategoryName_cnt") >= 2)
).show()
  • withColumn
    • 기존 컬럼의 업데이트, 타입 변경, 신규 컬럼 값 추가
    • withColumn(신규 컬럼명, 신규 컬럼값)
    • 컬럼명 변경은 withColumnRename() 메서드
  • size
    • 컬럼에 있는 array의 길이를 반환
    • list 형태의 len과 유사한 기능
  • collect_set
    • object들의 고유 집합 (= distinct한)을 반환
    • 요소를 set으로 묶음
  • (자매품) collect_list
    • object들의 집합을 반환
    • 요소를 list로 묶음
  • over
    • 컬럼의 window를 정의
    • window란
      • 일정한 기준으로 묶인 row들
  • Window
    • 위 window를 정의하기 하기위해 사용
  • partitionBy
    • window 중 그룹을 묶는 함수
    • groupBy와 유사
(
    sample_df
    .withColumn("id_set",
                F.collect_set("id").over(W.partitionBy("category"))
                )
    .withColumn("id_list",
                F.collect_list("id").over(W.partitionBy("category"))
                )
    ).show()
    
+---+--------+---------+---------+
| id|category|   id_set|  id_list|
+---+--------+---------+---------+
|  1|       b|[1, 2, 3]|[1, 2, 3]|
|  2|       b|[1, 2, 3]|[1, 2, 3]|
|  3|       b|[1, 2, 3]|[1, 2, 3]|
|  1|       a|   [1, 2]|[1, 1, 2]|
|  1|       a|   [1, 2]|[1, 1, 2]|
|  2|       a|   [1, 2]|[1, 1, 2]|
+---+--------+---------+---------+
df = (
    df
    .withColumn(
        "CategoryName", # 원래 있는 컬럼과 동일한 이름으로 withColumn을 할 경우, 기존 컬럼에 덮어쓰기가 됩니다.
        F.first(
            F.col("CategoryName"), ignorenulls=True # null인 경우를 제외하고 가장 첫번째
         ).over(W.partitionBy(F.col("Category")).orderBy(F.col("Date").desc()))
         # 다른경우가 존재하기 때문에 가장 최근 날짜 기준 이름으로 덮어쓰기
        )
    )
  • first
    • 가장 첫번 째 값을 반환
  • orderBy
    • 정렬을 위한 함수
    • 기본적으로 오름차순 정렬
    • 내림차순 정렬을 원한다면.desc()
df = df.withColumn("Date", F.to_date(F.col("Date"), 'MM/dd/yyyy'))
  • to_date

    • string을 date 형태로 바꿔줌
    • F.to_date(변형할 컬럼, format="현재 string이 어떤 형태로 써져있는지 명시")
  • 시간 형태를 위한 또 다른 매서드

    • to_timestamp
      • string을 timestamp 형태로 변형
      • F.to_timestamp(변형할 컬럼, format="현재 string이 어떤 형태로 써져있는지 명시")
      • MM-dd-yyyy HH:mm:ss.SSS‘
profile
도전적인 개발자

0개의 댓글