编程要求
打开右侧代码文件窗口,在 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() } }