Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 火花清洗和准备数据_Scala_Apache Spark_Apache Spark Mllib_Kaggle - Fatal编程技术网

Scala 火花清洗和准备数据

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

我从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 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
    的新临时列,其中我使用奇妙的
    函数
    将空格字符上的原始
    Ticket
    数据拆分为长度为1(如果只有一个数字)或2(如果文本后跟空格和数字)的数组
  • 我使用
    函数
    库中的
    when
    否则
    ,根据
    TicketSplit
    列中数组的大小修改原始
    Ticket
    列。无论
    TicketSplit
    列中的数组大小如何,最终只有通过在索引0处获取1元素数组的第一个元素或在索引1处获取2元素数组的第二个元素来保留数字
  • 删除
    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
    的新临时列,其中我使用奇妙的
    函数
    将空格字符上的原始
    Ticket
    数据拆分为长度为1(如果只有一个数字)或2(如果文本后跟空格和数字)的数组
  • 我使用
    函数
    库中的
    when
    否则
    ,根据
    TicketSplit
    列中数组的大小修改原始
    Ticket
    列。无论
    TicketSplit
    列中的数组大小如何,最终只有通过在索引0处获取1元素数组的第一个元素或在索引1处获取2元素数组的第二个元素来保留数字
  • 删除
    TicketSplit
    列,因为它已经达到了目的
  • 享受一杯可口的冷饮