Scala 火花清洗和准备数据
我从Scala、Spark和MLlib开始。 我想从一个实例中实现一个示例 数据格式很糟糕,我在清理和准备数据以处理它们时遇到了很多问题。我请求你的帮助 数据如下:Scala 火花清洗和准备数据,scala,apache-spark,apache-spark-mllib,kaggle,Scala,Apache Spark,Apache Spark Mllib,Kaggle,我从Scala、Spark和MLlib开始。 我想从一个实例中实现一个示例 数据格式很糟糕,我在清理和准备数据以处理它们时遇到了很多问题。我请求你的帮助 数据如下: PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S 2,1,1,"Cumings, Mrs. John
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
我在空字段中出错,例如
…,“”,。。。(第一行,字段“客舱”)
“A/521171”,。。。。(也是第一行,字段“票证”)
我想过滤带有空字段的行(从我的RDD中删除它们)以及具有类似以下票证的行A/5 21171(我只需要数字)
再次感谢你的帮助!;) >而不是<代码> RDD s,您应该考虑使用<代码> DataSet < /Cult> s,以便于性能和易用性(特别是如果您对斯卡拉是新的)。采用
DataSet
方法,您可以执行以下操作:
val titanicDs = sparkSession.read
.option("header", true)
.csv("titanic.csv")
.na
.drop
.withColumn("TicketSplit", split($"Ticket", " "))
.withColumn("Ticket", when(size($"TicketSplit") === "2", $"TicketSplit".getItem(1)).otherwise($"TicketSplit".getItem(0)))
.drop("TicketSplit")
这里发生了很多事情:
- 将
选项设置为true,以便Spark意识到第一行是数据上的标题结构,并在标题
中使用这些列名数据框
方法返回用于处理缺失数据的na
对象。在这种情况下,DataFrameNaFunctions
的组合将消除包含任何na.drop
数据的所有行null
- 我添加了一个名为
的新临时列,其中我使用奇妙的TicketSplit
将空格字符上的原始函数
数据拆分为长度为1(如果只有一个数字)或2(如果文本后跟空格和数字)的数组李>Ticket
- 我使用
库中的函数
和when
,根据否则
列中数组的大小修改原始TicketSplit
列。无论Ticket
列中的数组大小如何,最终只有通过在索引0处获取1元素数组的第一个元素或在索引1处获取2元素数组的第二个元素来保留数字TicketSplit
- 删除
列,因为它已经达到了目的TicketSplit
- 享受一杯可口的冷饮
而不是<代码> RDD s,您应该考虑使用<代码> DataSet < /Cult> s,以便于性能和易用性(特别是如果您对斯卡拉是新的)。采用
DataSet
方法,您可以执行以下操作:
val titanicDs = sparkSession.read
.option("header", true)
.csv("titanic.csv")
.na
.drop
.withColumn("TicketSplit", split($"Ticket", " "))
.withColumn("Ticket", when(size($"TicketSplit") === "2", $"TicketSplit".getItem(1)).otherwise($"TicketSplit".getItem(0)))
.drop("TicketSplit")
这里发生了很多事情:
- 将
选项设置为true,以便Spark意识到第一行是数据上的标题结构,并在标题
中使用这些列名数据框
方法返回用于处理缺失数据的na
对象。在这种情况下,DataFrameNaFunctions
的组合将消除包含任何na.drop
数据的所有行null
- 我添加了一个名为
的新临时列,其中我使用奇妙的TicketSplit
将空格字符上的原始函数
数据拆分为长度为1(如果只有一个数字)或2(如果文本后跟空格和数字)的数组李>Ticket
- 我使用
库中的函数
和when
,根据否则
列中数组的大小修改原始TicketSplit
列。无论Ticket
列中的数组大小如何,最终只有通过在索引0处获取1元素数组的第一个元素或在索引1处获取2元素数组的第二个元素来保留数字TicketSplit
- 删除
列,因为它已经达到了目的TicketSplit
- 享受一杯可口的冷饮