다음을 통해 공유


시작: 데이터 개선 및 정리

이 시작 문서에서는 Azure Databricks Notebook을 사용하여 Python, Scala, R로 이전에 Unity 카탈로그의 테이블에 로드된 뉴욕 주 아기 이름 데이터를 정리하고 개선하는 방법을 안내합니다. 이 문서에서는 열 이름을 변경하고, 대문자를 변경하고, 원시 데이터 테이블에서 각 아기 이름의 성별을 철자로 입력하고, DataFrame을 실버 테이블에 저장합니다. 그런 다음 2021년 데이터를 포함하도록 데이터를 필터링하고, 상태 수준에서 데이터를 그룹화한 다음, 데이터를 개수별로 정렬합니다. 마지막으로 이 DataFrame을 골드 테이블에 저장하고 막대형 차트에서 데이터를 시각화합니다. 실버 및 골드 테이블에 대한 자세한 내용은 medallion 아키텍처를 참조하세요.

Important

이 시작 문서는 시작: 추가 데이터 수집 및 삽입을 기반으로 합니다. 이 문서를 완료하려면 해당 문서의 단계를 완료해야 합니다. 시작 문서에 대한 전체 Notebook은 추가 데이터 Notebook 수집을 참조하세요.

요구 사항

이 문서의 작업을 완료하려면 다음 요구 사항을 충족해야 합니다.

  • 작업 영역에 Unity 카탈로그가 활성화되어 있어야 합니다. Unity 카탈로그를 시작하는 방법에 대한 자세한 내용은 Unity 카탈로그 설정 및 관리를 참조하세요.
  • 볼륨에 대한 WRITE VOLUME 권한, 부모 스키마에 대한 USE SCHEMA 권한, 부모 카탈로그에 대한 USE CATALOG 권한이 있어야 합니다.
  • 기존 컴퓨팅 리소스를 사용하거나 새 컴퓨팅 리소스를 만들 수 있는 권한이 있어야 합니다. 시작: 계정 및 작업 영역 설정을 참조하거나 Databricks 관리자에게 문의하세요.

이 문서의 완성된 Notebook은 데이터 Notebook 정리 및 개선을 참조하세요.

1단계: 새 Notebook 만들기

작업 영역에서 Notebook을 생성하려면 사이드바의 새 아이콘 새로 만들기를 클릭한 다음 Notebook을 클릭합니다. 작업 영역에서 빈 전자 필기장이 열립니다.

Notebook 만들기 및 관리에 대한 자세한 내용은 Notebook 관리를 참조하세요.

2단계: 변수 정의

이 단계에서는 이 문서에서 만든 예제 Notebook에서 사용할 변수를 정의합니다.

  1. 다음 코드를 복사하고 새로운 빈 Notebook 셀에 붙여넣습니다. <catalog-name>, <schema-name>, <volume-name>을 Unity 카탈로그 볼륨의 카탈로그, 스키마 및 볼륨 이름으로 바꿉니다. 선택에 따라 table_name 값을 원하는 테이블 이름으로 바꿀 수 있습니다. 이 문서의 뒷부분에서 아기 이름 데이터를 이 표에 저장합니다.

  2. 셀을 실행하고 새 빈 셀을 만들려면 Shift+Enter를 누릅니다.

    Python

    catalog = "<catalog_name>"
    schema = "<schema_name>"
    table_name = "baby_names"
    silver_table_name = "baby_names_prepared"
    gold_table_name = "top_baby_names_2021"
    path_table = catalog + "." + schema
    print(path_table) # Show the complete path
    

    Scala

    val catalog = "<catalog_name>"
    val schema = "<schema_name>"
    val tableName = "baby_names"
    val silverTableName = "baby_names_prepared"
    val goldTableName = "top_baby_names_2021"
    val pathTable = s"${catalog}.${schema}"
    print(pathTable) // Show the complete path
    

    R

    catalog <- "<catalog_name>"
    schema <- "<schema_name>"
    volume <- "<volume_name>"
    table_name <- "baby_names"
    silver_table_name <- "baby_names_prepared"
    gold_table_name <- "top_baby_names_2021"
    path_table <- paste(catalog, ".", schema, sep = "")
    print(path_table) # Show the complete path
    

3단계: 새 DataFrame에 원시 데이터 로드

이 단계에서는 추가 분석을 위해 이 데이터를 정리하고 개선하기 위한 준비로 이전에 델타 테이블에 저장된 원시 데이터를 새 DataFrame에 로드합니다.

  1. 다음 코드를 복사하고 새로운 빈 Notebook 셀에 붙여넣습니다.

    Python

    df_raw = spark.read.table(f"{path_table}.{table_name}")
    display(df_raw)
    

    Scala

    val dfRaw = spark.read.table(s"${pathTable}.${tableName}")
    display(dfRaw)
    

    R

    # Load the SparkR package that is already preinstalled on the cluster.
    library(SparkR)
    df_raw = sql(paste0("SELECT * FROM ", path_table, ".", table_name))
    display(df_raw)
    
  2. Shift+Enter 키를 눌러 셀을 실행하고 다음 셀로 이동합니다.

4단계: 원시 데이터를 정리 및 개선하고 저장

이 단계에서는 Year 열의 이름을 변경하고 Sex 열의 데이터를 첫 글자 대문자로 변경한 다음, First_Name 열의 값을 업데이트하여 성별을 철자로 표시한 다음 DataFrame을 새 테이블에 저장합니다.

  1. 다음 코드를 복사한 후 빈 Notebook 셀에 붙여넣습니다.

    Python

    from pyspark.sql.functions import col, initcap, when
    
    # Rename "Year" column to "Year_Of_Birth"
    df_rename_year = df_raw.withColumnRenamed("Year", "Year_Of_Birth")
    
    # Change the case of "First_Name" column to initcap
    df_init_caps = df_rename_year.withColumn("First_Name", initcap(col("First_Name").cast("string")))
    
    # Update column values from "M" to "male" and "F" to "female"
    df_baby_names_sex = df_init_caps.withColumn(
    "Sex",
        when(col("Sex") == "M", "Male")
        .when(col("Sex") == "F", "Female")
    )
    
    # display
    display(df_baby_names_sex)
    
    # Save DataFrame to table
    df_baby_names_sex.write.mode("overwrite").saveAsTable(f"{path_table}.{silver_table_name}")
    

    Scala

    import org.apache.spark.sql.functions.{col, initcap, when}
    
    // Rename "Year" column to "Year_Of_Birth"
    val dfRenameYear = dfRaw.withColumnRenamed("Year", "Year_Of_Birth")
    
    // Change the case of "First_Name" data to initial caps
    val dfNameInitCaps = dfRenameYear.withColumn("First_Name", initcap(col("First_Name").cast("string")))
    
    // Update column values from "M" to "Male" and "F" to "Female"
    val dfBabyNamesSex = dfNameInitCaps.withColumn("Sex",
        when(col("Sex") equalTo "M", "Male")
        .when(col("Sex") equalTo "F", "Female"))
    
    // Display the data
    display(dfBabyNamesSex)
    
    // Save DataFrame to a table
    dfBabyNamesSex.write.mode("overwrite").saveAsTable(s"${pathTable}.${silverTableName}")
    

    R

    # Rename "Year" column to "Year_Of_Birth"
    df_rename_year <- withColumnRenamed(df_raw, "Year", "Year_Of_Birth")
    
    # Change the case of "First_Name" data to initial caps
    df_init_caps <- withColumn(df_rename_year, "First_Name", initcap(df_rename_year$First_Name))
    
    # Update column values from "M" to "Male" and "F" to "Female"
    df_baby_names_sex <- withColumn(df_init_caps, "Sex",
                                    ifelse(df_init_caps$Sex == "M", "Male",
                                          ifelse(df_init_caps$Sex == "F", "Female", df_init_caps$Sex)))
    # Display the data
    display(df_baby_names_sex)
    
    # Save DataFrame to a table
    saveAsTable(df_baby_names_sex, paste(path_table, ".", silver_table_name), mode = "overwrite")
    
  2. Shift+Enter 키를 눌러 셀을 실행하고 다음 셀로 이동합니다.

5단계: 데이터 그룹화 및 시각화

이 단계에서는 데이터를 2021년으로만 필터링하고, 데이터를 성별 및 이름으로 그룹화하고, 개수별로 집계하고, 개수별로 정렬합니다. 그런 다음, DataFrame을 테이블에 저장하고 막대형 차트에서 데이터를 시각화합니다.

  1. 다음 코드를 복사한 후 빈 Notebook 셀에 붙여넣습니다.

    Python

    from pyspark.sql.functions import expr, sum, desc
    from pyspark.sql import Window
    
    # Count of names for entire state of New York by sex
    df_baby_names_2021_grouped=(df_baby_names_sex
    .filter(expr("Year_Of_Birth == 2021"))
    .groupBy("Sex", "First_Name")
    .agg(sum("Count").alias("Total_Count"))
    .sort(desc("Total_Count")))
    
    # Display data
    display(df_baby_names_2021_grouped)
    
    # Save DataFrame to a table
    df_baby_names_2021_grouped.write.mode("overwrite").saveAsTable(f"{path_table}.{gold_table_name}")
    

    Scala

    import org.apache.spark.sql.functions.{expr, sum, desc}
    import org.apache.spark.sql.expressions.Window
    
    // Count of male and female names for entire state of New York by sex
    val dfBabyNames2021Grouped = dfBabyNamesSex
      .filter(expr("Year_Of_Birth == 2021"))
      .groupBy("Sex", "First_Name")
      .agg(sum("Count").alias("Total_Count"))
      .sort(desc("Total_Count"))
    
    // Display data
    display(dfBabyNames2021Grouped)
    
    // Save DataFrame to a table
    dfBabyNames2021Grouped.write.mode("overwrite").saveAsTable(s"${pathTable}.${goldTableName}")
    

    R

    # Filter to only 2021 data
    df_baby_names_2021 <- filter(df_baby_names_sex, df_baby_names_sex$Year_Of_Birth == 2021)
    
    # Count of names for entire state of New York by sex
    df_baby_names_grouped <- agg(
      groupBy(df_baby_names_2021, df_baby_names_2021$Sex, df_baby_names_2021$First_Name),
      Total_Count = sum(df_baby_names_2021$Count)
    )
    # Display data
    display(arrange(select(df_baby_names_grouped, df_baby_names_grouped$Sex, df_baby_names_grouped$First_Name, df_baby_names_grouped$Total_Count), desc(df_baby_names_grouped$Total_Count)))
    
    # Save DataFrame to a table
    saveAsTable(df_baby_names_2021_grouped, paste(path_table, ".", gold_table_name), mode = "overwrite")
    
  2. Ctrl+Enter 키를 눌러 셀을 실행합니다.

    1. 테이블 탭 옆에 있는 +를 클릭한 다음 시각화를 클릭합니다.
  3. 시각화 편집기에서 시각적 개체 유형을 클릭하고 막대가 선택되어 있는지 확인합니다.

  4. X 열에서 First_Name을 선택합니다.

  5. Y 열에서 열 추가를 클릭한 다음 Total_Count를 선택합니다.

  6. 그룹화 기준에서 을 선택합니다.

    골드 테이블

  7. 저장을 클릭합니다.

데이터 Notebook 정리 및 개선

다음 Notebook 중 하나를 사용하여 이 문서의 단계를 수행합니다. <catalog-name>, <schema-name>, <volume-name>을 Unity 카탈로그 볼륨의 카탈로그, 스키마 및 볼륨 이름으로 바꿉니다. 선택에 따라 table_name 값을 원하는 테이블 이름으로 바꿀 수 있습니다.

Python

Python을 사용하여 데이터 정리 및 개선

Notebook 가져오기

Scala

Scala를 사용하여 데이터 정리 및 개선

Notebook 가져오기

R

R을 사용하여 데이터 정리 및 개선

Notebook 가져오기

추가 리소스