Scala for Backend Engineering & Functional Programming · บทเรียน

การรวมกลุ่ม

จัดกลุ่มและรวมค่า

บทเรียน 4 จาก 413 ขั้นตอน

การรวมกลุ่ม เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องรวมข้อมูล

การรวมข้อมูลสรุปแถวจำนวนมากให้เหลือน้อยลง เช่น ผลรวม ค่าเฉลี่ย และจำนวนต่อกลุ่ม ใน Spark การรวมข้อมูลเป็นการดำเนินการแบบกว้างที่อาจสับเปลี่ยนข้อมูลข้ามคลัสเตอร์

การรวมข้อมูลทั้งชุด

คำนวณสรุปค่าเดียวจาก DataFrame ทั้งหมดด้วย agg และฟังก์ชันอย่าง count, sum, avg, min, max

import org.apache.spark.sql.functions._

df.agg(
  count("*").as("rows"),
  avg("age").as("avg_age")
).show()

groupBy

groupBy จะแบ่งแถวตามคอลัมน์อย่างน้อยหนึ่งคอลัมน์ และสร้าง RelationalGroupedDataset ที่พร้อมสำหรับการรวมข้อมูล

import org.apache.spark.sql.functions._

val byCity = df.groupBy("city").agg(count("*").as("people"))
byCity.show()

การรวมข้อมูลหลายรายการ

ส่งนิพจน์การรวมข้อมูลหลายรายการให้กับ agg เพื่อคำนวณสรุปค่าหลายรายการต่อกลุ่มในรอบเดียว

import org.apache.spark.sql.functions._

df.groupBy("department").agg(
  sum("salary").as("total"),
  avg("salary").as("avg"),
  max("salary").as("top")
).show()

การนับค่าที่ไม่ซ้ำกัน

ใช้ countDistinct เพื่อนับค่าที่ไม่ซ้ำกัน และใช้ approx_count_distinct เพื่อนับค่าโดยประมาณได้เร็วขึ้นเมื่อชุดข้อมูลมีขนาดใหญ่มาก

import org.apache.spark.sql.functions._

df.agg(countDistinct("city").as("unique_cities")).show()

การกรองกลุ่มด้วย having

ใน SQL HAVING ใช้กรองกลุ่มที่รวมข้อมูลแล้ว ใน DSL ให้ใช้ filter หลัง agg กับคอลัมน์ที่คำนวณได้

import org.apache.spark.sql.functions._

df.groupBy("city")
  .agg(count("*").as("n"))
  .filter(col("n") > 100)
  .show()

การรวมข้อมูลใน SQL

ใช้ตรรกะเดียวกับคิวรี SQL ที่ทำงานกับมุมมองที่ลงทะเบียนไว้ โดยใช้ GROUP BY และ HAVING

df.createOrReplaceTempView("people")
spark.sql(
  "SELECT city, COUNT(*) AS n FROM people GROUP BY city HAVING COUNT(*) > 100"
).show()

ตารางพิวอต

pivot เปลี่ยนค่าที่แตกต่างกันของคอลัมน์ให้เป็นคอลัมน์แยกกัน เหมาะสำหรับตารางไขว้ เช่น ยอดขายต่อภูมิภาคต่อไตรมาส

import org.apache.spark.sql.functions._

sales.groupBy("region")
     .pivot("quarter")
     .agg(sum("amount"))
     .show()

ฟังก์ชันหน้าต่าง

ฟังก์ชันหน้าต่างจะรวมข้อมูลในกรอบที่เลื่อนไปมา โดยไม่ยุบแถว เหมาะอย่างยิ่งสำหรับผลรวมสะสมหรือลำดับ排名

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val w = Window.partitionBy("dept").orderBy(col("salary").desc)
df.withColumn("rank", rank().over(w)).show()

การรวมข้อมูลของ RDD

ในระดับ RDD aggregateByKey และ reduceByKey จะรวมค่าตามคีย์ด้วยตรรกะที่กำหนดเอง และรวมค่าล่วงหน้าในเครื่องเพื่อประสิทธิภาพ

val pairs = sc.parallelize(Seq(("a", 10), ("a", 20), ("b", 5)))
val sums  = pairs.reduceByKey(_ + _)
// (a, 30), (b, 5)

groupBy ใน Scala ธรรมดา

แอนะล็อกแบบทำงานได้ในตัวเอง: groupBy ของคอลเลกชันใน Scala ร่วมกับ mapValues จำลองการจัดกลุ่มและรวมข้อมูลของ Spark

object Main {
  def main(args: Array[String]): Unit = {
    val data = Seq(("a", 10), ("a", 20), ("b", 5))
    val sums = data.groupBy(_._1).map { case (k, v) => k -> v.map(_._2).sum }
    sums.toSeq.sortBy(_._1).foreach { case (k, s) => println(s"$k: $s") }
  }
}

ตรวจสอบอย่างรวดเร็ว

คุณลักษณะใดรวมข้อมูลในกรอบของแถว โดยไม่ยุบแถวเหลือหนึ่งแถวต่อกลุ่ม

สรุปทบทวน

คุณได้รวมข้อมูลใน Spark:

  • agg ร่วมกับ count, sum, avg, min, max
  • groupBy การรวมข้อมูลหลายรายการ และการกรองด้วย having
  • pivot และฟังก์ชันหน้าต่าง
  • reduceByKey / aggregateByKey ของ RDD

คุณเรียนหลักสูตร Apache Spark จบแล้ว

เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

คำถามที่พบบ่อย

บทเรียน “การรวมกลุ่ม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การรวมกลุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การรวมกลุ่ม”

จัดกลุ่มและรวมค่า คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การรวมกลุ่ม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. RDD และ DataFrames
  2. การแปลงและการดำเนินการ
  3. Spark SQL
  4. การรวมกลุ่ม
← กลับไปที่ Scala for Backend Engineering & Functional Programming