Patient3.csv中包含病历数据,字段分别为:pid, 身高,体重,腰围,舒张压,收缩压。请RDD操作分别统计以下值:
病人数量、平均身高、体重最大值、收缩压方差
按体重升序、舒张压降序排序并输出
使用sbt对Scala独立应用程序进行编译打包
Patient3代码:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
object Patient3 {
def main(args: Array[String]) {
val file_path = "file:///usr/local/spark/patients3.csv" // 定义CSV文件路径
val conf = new SparkConf().setAppName("PatientDataAnalysis")
val sc = new SparkContext(conf)
// 读取CSV文件并转换为RDD格式
val rdd = sc.textFile(file_path)
// 跳过表头
val header = rdd.first()
val data = rdd.filter(line => line != header)
// 划分每行数据,并转换为需要的数据类型
val parsedData = data.map(line => {
val arr = line.split(',')
(arr(0).toInt, arr(1).toDouble, arr(2).toDouble, arr(3).toDouble, arr(4).toInt, arr(5).toInt)
})
// 1) 统计病人数量、平均身高、体重最大值和收缩压方差
val patientCount = parsedData.count()
val averageHeight = parsedData.map(x => x._2).mean()
val maxWeight = parsedData.map(x => x._3).max()
val varianceSystolicPressure = parsedData.map(x => x._6).variance()
// 输出统计结果
println("病人数量: " + patientCount)
println("平均身高: " + averageHeight)
println("体重最大值: " + maxWeight)
println("收缩压方差: " + varianceSystolicPressure)
// 2) 按体重升序、舒张压降序排序并输出
val sortedByWeight = parsedData.sortBy(x => x._3)
val sortedByDiastolicPressure = parsedData.sortBy(x => x._5, ascending = false)
// 输出排序结果
println("体重升序:")
sortedByWeight.collect().foreach(println)
println("舒张压降序:")
sortedByDiastolicPressure.collect().foreach(println)
sc.stop()
}
}
结果输出会过多,将结果保存file:///usr/local/spark/patients3.csv > output.log,在output.log中抓取grep有用结果
/usr/local/spark/bin/spark-submit --class "Patient3" ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar file:///usr/local/spark/patients3.csv > output.log
grep "病人数量\|平均身高\|体重最大值\|收缩压方差" output.log
grep "体重升序:\|舒张压降序:" output.log
结果截图:
体重和舒张压可以在output中看
部分结果:
体重升序
舒张压降序
温度.txt数据中包含一段时间的温度测量数据,数据说明如下:
第15-19个字符是年份
第45-50位是温度表示,+表示零上 -表示零下,且温度的值不能是9999,9999表示异常数据
第50位值只能是0、1、4、5、9几个数字
要求:采用Spark SQL实现获取每年的最低温度。
使用Spark SQL进行的DataFrame操作
启动spark-shell,代码如下:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
val spark = SparkSession.builder().appName("Temperature Analysis").getOrCreate()
val temperatureData = spark.read.textFile("file:///usr/local/spark/温度.txt")
val yearColumn = substring(col("value"), 16, 4).cast("integer").as("year")
val temperatureValueColumn = substring(col("value"), 47, 5).cast("decimal(10,2)").as("temperature")
val parsedData = temperatureData.filter(length(trim(col("value"))) > 0).select(yearColumn, temperatureValueColumn).filter(col("temperature") =!= 99999)
val minTemperatureByYear = parsedData.groupBy("year").agg(min("temperature").as("min_temperature")).orderBy("year")
minTemperatureByYear.show()
结果截图:
PS:题目有点问题,年份实际是16-19;温度是47-51
OVER!