각 그룹의 첫 번째 행을 효율적으로 선택
이 글의 목적은 각 '시간' 및 '범주' 그룹화에서 '총액'이 가장 높은 데이터 행을 추출하는 것입니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
창 기능 사용:
창 기능은 각 그룹 내에서 계산을 수행하는 효율적인 방법을 제공합니다. 한 가지 방법은 다음과 같습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!