习题 15:读取后排序

题目:编写 Spark 代码读取指定目录下的 15.csv 文件。每行按逗号分割,过滤字段总数不足 4 列的脏数据;将第三列转为浮点型作为排序 key,执行降序排序;第三列相同时按第四列排序,并输出所有列。

15.csv

col1,col2,col3,col4
A,1,3.5,X
B,2,2.1,Y
C,3,3.5,A
D,4,1.0,Z
import org.apache.spark.{SparkConf, SparkContext}

object CsvSortExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("CsvSort").setMaster("local[*]")
    val sc = new SparkContext(conf)

    val lines = sc.textFile("15.csv")

    val sortedResult = lines
      .map(line => line.split(",", -1))
      .filter(fields => fields.length >= 4)
      .map { fields =>
        val key3 = fields(2).toDouble
        val key4 = fields(3)
        (key3, key4, fields)
      }
      .sortBy({ case (k3, k4, _) => (k3, k4) }, ascending = false)
      .map(_._3.mkString(","))

    sortedResult.take(20).foreach(println)
    sc.stop()
  }
}