编程要求


打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,根据下列要求,完善程序。

读取本地文件file:///data/bigfiles/test.txt,使用 Spark SQL 对文件的每一行按空格进行切割,切割后按顺序设置别名,分别是name,chinese,math,english。

创建两个自定义函数,将 name 字段中的小写全部转为大写,将 chinese,math,english 字段的值全部相加,设置别名为 total。

按 total 降序输出 name 与 total 字段。

test.txt 文件内容如下:

王小美 80 90 85
张小花 70 85 90
李小刚 88 79 86
赵小甜 79 88 95
何小天 88 86 87
秦小强 75 82 83
注意,输出时表头列的别名分别为 name、total。

测试说明
平台将对你编写的代码进行评测,如果与预期结果一致,则通关,否则测试失败。

答案:

import org.apache.spark.sql.api.java.UDF1
import org.apache.spark.sql.types.{IntegerType, StringType}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.{DataFrame, SparkSession}

object First_Question {

  def main(args: Array[String]): Unit = {
    
    val spark: SparkSession = SparkSession
      .builder()
      .appName("First_Question")
      .master("local[*]")
      .getOrCreate()

    /******************* Begin *******************/  
    // 1. 读取【本地文件】(关键:添加 file:// 前缀,避免访问HDFS)
    val studentDF: DataFrame = spark.read.text("file:///data/bigfiles/test.txt")
      .select(
        split(col("value"), " ")(0).alias("name"),          // 姓名
        split(col("value"), " ")(1).cast(IntegerType).alias("chinese"), // 语文
        split(col("value"), " ")(2).cast(IntegerType).alias("math"),    // 数学
        split(col("value"), " ")(3).cast(IntegerType).alias("english")  // 英语
      )

    // 2. 自定义函数1:姓名小写转大写
    val toUpperUDF = udf((name: String) => name.toUpperCase)

    // 3. 自定义函数2:三科分数求和
    val sumScoreUDF = udf((ch: Int, ma: Int, en: Int) => ch + ma + en)

    // 4. 应用函数 + 排序 + 输出指定字段
    val resultDF = studentDF.select(
      toUpperUDF(col("name")).alias("name"),
      sumScoreUDF(col("chinese"), col("math"), col("english")).alias("total")
    ).orderBy(desc("total"))

    // 5. 打印结果(匹配预期格式)
    resultDF.show()
        
    /******************* End *******************/

    spark.stop()
  }
}

更多推荐