如何在Spark鍵值對資料中,對指定的Key進行輸出/篩選/模式匹配

你这过氧化氢掺水了發表於2024-09-09

在用鍵值對RDD進行操作時,經常會遇到不知道如何篩選出想要資料的情況,這裡提供了一些解決方法


目錄
  • 1、對固定的Key資料進行查詢
  • 2、對不固定的Key資料進行模糊查詢


1、對固定的Key資料進行查詢

程式碼說明:

  1. SparkConf:配置 Spark 應用程式的一些基本資訊。
  2. SparkContext:建立 Spark 上下文以在 Spark 中執行操作。
  3. parallelize:生成一個包含多個鍵值對的初始 RDD。
  4. filter:使用 filter 方法篩選出 key 等於指定值的元素。
  5. collect:收集結果並在驅動程式上進行輸出。
  6. foreach:用來遍歷和列印過濾後的結果。
import org.apache.spark.{SparkConf, SparkContext}

object KeyFilterExample {
  def main(args: Array[String]): Unit = {
    // 初始化 SparkContext
    val conf = new SparkConf().setAppName("Key Filter Example").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 建立一個示例 RDD,包含 key-value 鍵值對
    val rdd = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3), ("a", 4), ("b", 5)))

    // 定義要篩選的特定 key
    val specifiedKey = "a"

    // 使用 filter 操作輸出指定的 key 值
    val filteredRdd = rdd.filter { case (key, _) => key == specifiedKey }

    // 輸出結果
    filteredRdd.collect().foreach { case (key, value) =>
      println(s"Key: $key, Value: $value")
    }

    // 停止 SparkContext
    sc.stop()
  }
}



2、對不固定的Key資料進行模糊查詢

程式碼說明:

  1. SparkConfSparkContext:與之前示例相同,用於初始化 Spark 應用。
  2. parallelize:生成一個包含多個鍵值對的初始 RDD。
  3. filter:使用 Scala 的模式匹配功能來篩選出以字母 'a' 開頭的 keys。
    • case (key, _) if key.startsWith("a"):當 key 以 'a' 開頭時,返回 true,否則返回 false
  4. collect:收集結果並在驅動程式上進行輸出。
  5. foreach:遍歷並列印過濾後的結果。
import org.apache.spark.{SparkConf, SparkContext}

object PatternMatchingKeyExample {
  def main(args: Array[String]): Unit = {
    // 初始化 SparkContext
    val conf = new SparkConf().setAppName("Pattern Matching Key Example").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 建立一個示例 RDD,包含 key-value 鍵值對
    val rdd = sc.parallelize(Seq(("apple", 1), ("banana", 2), ("apricot", 3),
                                  ("berry", 4), ("avocado", 5)))

    // 使用 filter 操作與模式匹配篩選以 'a' 開頭的 keys
    val patternMatchedRdd = rdd.filter { 
      case (key, _) if key.startsWith("a") => true
      case _ => false
    }

    // 輸出結果
    patternMatchedRdd.collect().foreach { case (key, value) =>
      println(s"Key: $key, Value: $value")
    }

    // 停止 SparkContext
    sc.stop()
  }
}

相關文章