> 데이터 베이스 > MySQL 튜토리얼 > Spark에서 각 그룹의 최상위 행을 효율적으로 선택하는 방법은 무엇입니까?

Spark에서 각 그룹의 최상위 행을 효율적으로 선택하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-23 12:57:10
원래의
1020명이 탐색했습니다.

How to Efficiently Select the Top Row for Each Group in Spark?

각 그룹의 첫 번째 행을 효율적으로 선택

이 글의 목적은 각 '시간' 및 '범주' 그룹화에서 '총액'이 가장 높은 데이터 행을 추출하는 것입니다. 이를 수행하는 방법에는 여러 가지가 있습니다.

창 기능 사용:

창 기능은 각 그룹 내에서 계산을 수행하는 효율적인 방법을 제공합니다. 한 가지 방법은 다음과 같습니다.

<code>import org.apache.spark.sql.functions.{row_number, max, broadcast}
import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy($"Hour").orderBy($"TotalValue".desc)

val dfTop = df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop("rn")</code>
로그인 후 복사

SQL 집계 및 조인 사용:

또 다른 접근 방식은 SQL 집계 및 후속 조인을 활용하는 것입니다.

<code>val dfMax = df.groupBy($"Hour".as("max_hour")).agg(max($"TotalValue").as("max_value"))

val dfTopByJoin = df.join(broadcast(dfMax),
    ($"Hour" === $"max_hour") && ($"TotalValue" === $"max_value"))
  .drop("max_hour")
  .drop("max_value")</code>
로그인 후 복사

구조 정렬 사용:

"총 가치"와 "카테고리"를 포함하는 구조체를 정렬하는 것이 현명한 방법입니다.

<code>val dfTop = df.select($"Hour", struct($"TotalValue", $"Category").alias("vs"))
  .groupBy($"Hour")
  .agg(max("vs").alias("vs"))
  .select($"Hour", $"vs.Category", $"vs.TotalValue")</code>
로그인 후 복사

DataSet API 사용(Spark 1.6):

DataSet API는 동일한 결과를 얻을 수 있는 간결한 방법을 제공합니다.

<code>case class Record(Hour: Integer, Category: String, TotalValue: Double)

df.as[Record]
  .groupBy($"Hour")
  .reduce((x, y) => if (x.TotalValue > y.TotalValue) x else y)</code>
로그인 후 복사

실수를 피하는 방법:

다음 방법은 신뢰할 수 없는 결과를 초래할 수 있으므로 피해야 합니다.

  • df.orderBy(...).groupBy(...).agg(first(...), ...)
  • df.orderBy(...).dropDuplicates(...)

위 내용은 Spark에서 각 그룹의 최상위 행을 효율적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿