如下几个命令,可以让你快速记住spark的RDD, dataframe以及SQL API.

// 创建一个 RDD,其中包含一个键值对列表,表示水果名称和对应的数量
val rdd = sc.parallelize(List(("apple", 3), ("cherry", 4), ("orange", 2), ("apple", 2)))

// 使用 collect 方法将 RDD 的数据收集到一个数组中并打印(主要用于调试)
rdd.collect
// 输出:Array((apple,3), (cherry,4), (orange,2), (apple,2))
// 解释:原始数据包含两个 "apple",它们的值分别为 3 和 2。

// 对 RDD 按键(水果名称)进行分组,并将相同键的值相加(reduceByKey),然后按值(数量)降序排序(sortBy)
// 最终使用 collect 方法将结果收集到数组中并打印
rdd.reduceByKey(_+_).sortBy(-_._2).collect
// 输出:Array((apple,5), (cherry,4), (orange,2))
// 解释:reduceByKey(_+_) 将相同键的值相加,得到 (apple,5)、(cherry,4)、(orange,2)。
// 然后按数量从大到小排序。

// 将 RDD 转换为 DataFrame,并为列命名为 "fruit" 和 "count"
val df = rdd.toDF("fruit", "count")
// DataFrame 的结构是 [fruit: string, count: int]

// 对 DataFrame 按 "fruit" 列分组,并计算 "count" 列的总和(sum),重命名为 "total"
// 然后按 "total" 列降序排序,并显示结果
df.groupBy("fruit").agg(sum("count").as("total")).orderBy(desc("total")).show
// 输出:
// +------+-----+
// | fruit|total|
// +------+-----+
// | apple|    5|
// |cherry|    4|
// |orange|    2|
// +------+-----+
// 解释:groupBy("fruit") 是对 "fruit" 列进行分组,agg(sum("count").as("total")) 计算每个分组的 "count" 总和,
// 并将结果列命名为 "total"。最后通过 orderBy(desc("total")) 按总和降序排序。

// 将 DataFrame 注册为临时视图,命名为 "fruits"
df.createOrReplaceTempView("fruits")

// 使用 Spark SQL 执行查询  
val result = spark.sql( """ SELECT fruit, SUM(count) AS total FROM fruits GROUP BY fruit ORDER BY total DESC """.stripMargin) 

// 显示结果  
result.show()

以下是将 DataFrame 操作完全转换为 SQL 查询的完整代码:


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

val spark = SparkSession.builder()
  .appName("DataFrame to SQL Example")
  .master("local[*]") // 本地运行模式
  .getOrCreate()

import spark.implicits._

// 创建 RDD
val rdd = spark.sparkContext.parallelize(List(("apple", 3), ("cherry", 4), ("orange", 2), ("apple", 2)))

// 将 RDD 转换为 DataFrame
val df = rdd.toDF("fruit", "count")

// 将 DataFrame 注册为临时视图
df.createOrReplaceTempView("fruits")

// 使用 SQL 查询
val result = spark.sql(
  """
    |SELECT fruit, SUM(count) AS total
    |FROM fruits
    |GROUP BY fruit
    |ORDER BY total DESC
  """.stripMargin)

// 显示结果
result.show()

总结:
上述代码从一个键值对列表开始,先通过 RDD API(如 reduceByKeysortBy)进行分组聚合和排序操作,再将 RDD 转换为 DataFrame,使用更高级的 SQL 操作(如分组聚合和降序排序),最终得到相同的结果。这展示了 Spark 中 RDD 和 DataFrame 的操作方式及其灵活性。最后将dataframe转换成SQL临时表,可以针对临时表进行SQL查询。