基于泰坦尼克号生还数据进行 Spark 分析

基于泰坦尼克号生还数据进行 Spark 分析

在这篇博客中,我们将展示如何使用 Apache Spark 分析著名的泰坦尼克号数据集。通过这篇教程,您将学习如何处理数据、分析乘客的生还情况,并生成有价值的统计信息。

数据解析

• PassengerId : 乘客编号。
• Survived : 是否存活,0表示未能存活,1表示存活。
• Pclass : 描述乘客所属的等级,总共分为三等,用1、2、3来描述:1表示高等;2表示中等;3表示低等。
• Name : 乘客姓名。
• Sex : 乘客性别。
• Age : 乘客年龄。
• SibSp : 与乘客同行的兄弟姐妹(Siblings)和配偶(Spouse)数目。
• Parch : 与乘客同行的家长(Parents)和孩子(Children)数目。
• Ticket : 乘客登船所使用的船票编号。
• Fare : 乘客上船的花费。
• Cabin : 乘客所住的船舱。
• Embarked : 乘客上船时的港口,C表示Cherbourg;Q表示Queenstown;S表示Southampton。

在这里插入图片描述

环境设置

首先,我们需要设置 Spark 环境并创建 SparkSession 对象。以下是代码片段:

    val conf = new SparkConf().setMaster("local[*]").setAppName("practice1")val spark = SparkSession.builder().config(conf).getOrCreate()// 导入隐式转换相关依赖import spark.implicits._// 读取 CSV 文件生成 DataFrame 对象val df = spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").load("titanic.csv")

数据预处理

在分析之前,我们需要对数据进行预处理,包括数据类型转换和缺失值处理。

修改字段数据类型

我们将字段转换为适当的数据类型:

    val md_df = df.withColumn("Pclass", df("Pclass").cast(IntegerType)).withColumn("Survived", df("Survived").cast(IntegerType)).withColumn("Age", df("Age").cast(DoubleType)).withColumn("SibSp", df("SibSp").cast(IntegerType)).withColumn("Parch", df("Parch").cast(IntegerType)).withColumn("Fare", df("Fare").cast(DoubleType))

删除不必要的字段

删除不需要的字段,以简化数据集:

    val df1 = md_df.drop("PassengerId").drop("Name").drop("Ticket").drop("Cabin")

处理缺失值

统计缺失值,并填充缺失数据:

    val columns: Array[String] = df1.columnsval missing_cnt: Array[Long] = columns.map(field => df1.select(col(field)).where(col(field).isNull).count())val tuples: Array[(Long, String)] = missing_cnt.zip(columns)val result_df: DataFrame = spark.sparkContext.parallelize(tuples).toDF("missing_cnt", "column_name")result_df.show()

在这里插入图片描述

    def meanAge(dataFrame: DataFrame): Double = {dataFrame.select("Age").na.drop().agg(round(mean("Age"), 0)).first().getDouble(0)}val df2 = df1.na.fill(Map("Age" -> meanAge(df1), "Embarked" -> "S"))df2.show()

在这里插入图片描述

数据分析

1. 生还人数统计

统计生还人数,并保存结果:

    val survived_count: DataFrame = df2.groupBy("Survived").count()survived_count.show()survived_count.coalesce(1).write.option("header", "true").csv("output/practice1/survived_count.csv")

在这里插入图片描述

2. 不同上船港口生还情况

val survived_embark = df2.groupBy("Embarked", "Survived").count()
survived_embark.show()
survived_embark.coalesce(1).write.option("header", "true").csv("data/practice1survived_embark.csv")

在这里插入图片描述

3. 存活/未存活的男女数量及比例

val survived_sex_count = df2.groupBy("Sex", "Survived").count()
val survived_sex_percent = survived_sex_count.withColumn("percent", format_number(col("count").divide(functions.sum("count").over()).multiply(100), 5))
survived_sex_percent.show()
survived_sex_percent.coalesce(1).write.option("header", "true").csv("data/practice1/survived_sex_percent.csv")

在这里插入图片描述

4. 不同级别乘客生还人数和占总生还人数的比例

val survived_df = df2.filter(col("Survived") === 1)
val pclass_survived_count = survived_df.groupBy("Pclass").count()
val pclass_survived_percent = pclass_survived_count.withColumn("percent", format_number(col("count").divide(functions.sum("count").over()).multiply(100), 5))
pclass_survived_percent.show()
pclass_survived_percent.coalesce(1).write.option("header", "true").csv("data/practice1/pclass_survived_percent.csv")

在这里插入图片描述

5. 有无同行父母/孩子的生还情况

val df4 = df2.withColumn("Parch_label", when(df2("Parch") > 0, 1).otherwise(0))
val parch_survived_count = df4.groupBy("Parch_label", "Survived").count()
parch_survived_count.show()
parch_survived_count.coalesce(1).write.option("header", "true").csv("data/practice1/parch_survived_count.csv")

在这里插入图片描述

6. 按照年龄分类的生还情况

val df3 = survived_df.withColumn("Age_label", when(df2("Age") <= 18, "minor").when(df2("Age") > 18 && df2("Age") <= 35, "young").when(df2("Age") > 35 && df2("Age") <= 55, "middle").otherwise("older"))
val age_survived = df3.groupBy("Age_label", "Survived").count()
age_survived.show()
age_survived.coalesce(1).write.option("header", "true").csv("data/practice1/age_survived.csv")

在这里插入图片描述

7. 提取乘客等级和上船费用信息

val sef = Seq("Pclass", "Fare")
val df5 = df2.select(sef.head, sef.tail: _*)
df5.show(5)
df5.coalesce(1).write.option("header", "true").csv("data/practice1/pclass_fare.csv")

在这里插入图片描述

总结

通过上述步骤,我们使用 Spark 对泰坦尼克号数据进行了全面的分析,从数据预处理到统计分析。希望这篇博客能帮助您更好地理解如何使用 Spark 进行数据处理和分析。

如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于MapReduce, MySQL, python,java,大数据,模型训练等。 hadoop hdfs yarn spark Django flask flink kafka flume datax sqoop seatunnel echart可视化 机器学习等
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序[原理,C++实现,注意事项,时间复杂度分析]

模板&#xff1a; //本模板来自ACwing void quick_sort(int q[],int l,int r) {if(l>r) return;int xq[lr>>1],il-1,jr1;while(i<j){do i;while(q[i]<x);do j--;while(q[j]>x); if(i<j) swap(q[i],q[j]);}quick_sort(q,l,j);quick_sort(q,j1,r); };原理&…

注册中心组成结构和基本原理解析

假如你正在设计和开发一个分布式服务系统&#xff0c;系统中存在一批能够独立运行的服务&#xff0c;而在部署上也采用了集群模式以防止出现单点故障。显然&#xff0c;对于一个完整的业务系统而言&#xff0c;这些服务之间需要相互调用并形成复杂的访问链路&#xff0c;一种可…

codesys多段直线电机跨电机控制

1. 电机描述 在X轴上有多段直线电机&#xff0c;如下图有9个&#xff0c;从X1到X9. 2.codesys程序结构 程序名称&#xff1a;Pou_two_motors 动作名称&#xff1a;ACT_move 把这个程序搞到任务配置里面 通过ethercat总线命名一下这些电机&#xff0c;方便调用。 3.程序内容 P…

油烟监测仪:守护厨房,让蓝天白云成为常态

夏日炎炎&#xff0c;白天的酷暑让人们更加向往夜晚的凉爽与惬意。在这样的季节里&#xff0c;品尝各式烧烤、小龙虾&#xff0c;再搭配一杯冰镇啤酒&#xff0c;成为了许多市民夜晚消遣的不二选择。然而&#xff0c;随之而来的餐饮油烟问题也进入了高发阶段&#xff0c;对周边…

智能锁赛博化,凯迪仕携全球顶尖科技亮相建博会!

7月8日&#xff0c;作为大家居建材行业全球规模第一大展&#xff0c;2024中国建博会&#xff08;广州&#xff09;在广交会展馆正式拉开序幕。据官方数据显示&#xff0c;本届展会展出规模展览总规模近40万平方米&#xff0c;建筑装饰领域各细分题材的一线品牌几乎全部参展。 其…

循环练习题

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {double sum0;for (int i1;i<100;i){if (i%2!0){sum1.0/i;}else {sum-1.0/i;}}System.out.println(sum);} 结果为&#xff1a;

vscode取消未使用变量的提示(爆红)

目前项目正在使用ts&#xff08;TypeScript&#xff09;&#xff0c;可以在 tsconfig.json 文件中调整编译选项 在你的项目中找到并打开 tsconfig.json 文件&#xff0c;将noUnusedLocals和noUnusedParameters设置为false&#xff0c;关闭vscode重新打开项目即可 {"comp…

Mysql 高性能索引

引言 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 常见的索引类型包括B-Tree索引、哈希索引、空间数据索引&#xff08;R-Tree&#xff09;、全文索引。 索引的类型 在MySQL中&#xff0c;索引是在 存储引擎层 而不是服…

井字游戏00

题目链接 井字游戏 题目描述 注意点 1 < board.length board[i].length < 100输入一定遵循井字棋规则 解答思路 如果某一方想要获胜&#xff0c;则其需要占满某一行或某一列或对角线&#xff0c;所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线…

EHS管理体系,重塑造企业竞争力的关键密码

在当今这个快速发展的时代&#xff0c;企业面临着前所未有的挑战与机遇。随着全球环保意识的普遍觉醒&#xff0c;以及社会各界对企业社会责任的日益关注&#xff0c;EHS&#xff08;环境&#xff0c;健康&#xff0c;安全&#xff09;管理体系成为了企业稳健前行的重要基石。它…

设计模式之Facade设计模式

Facade设计模式&#xff0c;也称为外观模式&#xff0c;是一种结构型设计模式&#xff0c;它主要用于为子系统中的一组接口提供一个统一的高层接口&#xff0c;从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍&#xff1a; 一、定义 Facade模式为多个复杂的…

一款强大且免费开源的多连接数据库管理工具

大家好&#xff0c;今天给大家分享一款免费开源的跨平台数据库管理工具DbGate。 DbGate是一款免费开源的跨平台数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQL Server、MongoDB、SQLite等。它可以在Windows、Linux、Mac操作系统上运行&#…

【概念介绍】Signed Distance Function(SDF)

三维空间的表示形式可以分为显式和隐式 显式&#xff1a; 体素Voxel&#xff0c;点云Point Cloud&#xff0c;三角面片Mesh隐式&#xff1a;符号距离函数Signed Distance Funciton(SDF)&#xff0c;占用场Occupancy Field&#xff0c;神经辐射场Neural Radiance Field&#xff…

MAC在网络结构中的位置:深入解析

MAC在网络结构中的位置&#xff1a;深入解析 在网络通信的世界里&#xff0c;每一层都扮演着至关重要的角色。今天&#xff0c;我们将聚焦于一个经常被提到但可能不太被理解的概念&#xff1a;MAC&#xff08;Media Access Control&#xff0c;媒体访问控制&#xff09;。我们…

命名空间namespace--c++入门基础等

个人主页点这里~ 1.命名空间-namespace 简介 &#xff1a;在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xf…

echarts图表加载显示空白

数据请求了&#xff0c;图表加载显示空白 报错&#xff1a; Error: Initialize failed: invalid dom. at Object.init (echarts.js:2273:1) 方案 1. 通过this.$nexttick(()>{}) , 试过&#xff0c; 还是不行 2、把 this.lineChart2 this.$echarts.init(document.g…

EV代码签名-解决软件下载时风险警告

软件开发公司在发布软件后&#xff0c;用户尝试下载并安装软件时&#xff0c;如果被SmartScreen识别不常见或尚未建立起良好的信誉度&#xff0c;系统会发出警告&#xff0c;提示用户软件程序可能会对电脑构成风险&#xff0c;或者提示软件非正版软件&#xff0c;这有可能会造成…

点播CDN回源标准化策略

一、背景&问题&#xff1a; 背景&#xff1a; 历史上公司点播CDN接入的厂商就比较多 厂商之间回源的方式存在细节上的差异 不同的厂商之间专线大小存在差异 厂商之间的定位不同&#xff0c;有全镜像存储厂商&#xff0c;作为源站资源副本永久存储&#xff0c;也有镜像存…

Python提取视频文案

Python提取视频文案 1、背景描述2、视频转音频3、音频转文字 1、背景描述 在多媒体应用中&#xff0c;视频是一个信息量巨大的载体。然而&#xff0c;有时我们需要从视频中提取语音并转换为文本&#xff0c;以用于文本分析和机器学习训练 其中主要涉及到两个过程&#xff1a;视…

LeetCode67(二进制求和[位运算,大数运算])

二进制求和 题目要求: 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 这道题其实有几种解法.我们先来介绍简单的方法. 我们可以将两个字符串的二进制转成十进制,获取对应值相加之后,我们可以不断对2取余,获取尾数拼接即可.也就是像我们平常求一…