spark作业

Patient3.csv中包含病历数据,字段分别为:pid, 身高,体重,腰围,舒张压,收缩压。请RDD操作分别统计以下值:

病人数量、平均身高、体重最大值、收缩压方差

按体重升序、舒张压降序排序并输出

使用sbt对Scala独立应用程序进行编译打包

链接🔗:编写Spark应用程序-CSDN博客

 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! 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值