头歌Spark SQL 自定义函数(Scala)
·
编程要求
打开右侧代码文件窗口,在 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()
}
}
更多推荐
所有评论(0)