Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
mllib的Scala中的java.lang.NumberFormatException_Scala_Apache Spark_K Means_Apache Spark Mllib - Fatal编程技术网

mllib的Scala中的java.lang.NumberFormatException

mllib的Scala中的java.lang.NumberFormatException,scala,apache-spark,k-means,apache-spark-mllib,Scala,Apache Spark,K Means,Apache Spark Mllib,我只是想开发一个简单的K-Means算法示例,但是我在加载和清理数据时遇到了很多问题 这是我的代码: import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.clustering.KMeans import org.apache.spark.sql.functions._ val crimeRDD = sc.textFile("/home/borja/spark/pruebas/AlgoritmoC

我只是想开发一个简单的K-Means算法示例,但是我在加载和清理数据时遇到了很多问题

这是我的代码:

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.sql.functions._


val crimeRDD = sc.textFile("/home/borja/spark/pruebas/AlgoritmoClusterizacion/filter_data1.csv")

val header = crimeRDD.first

val data = crimeRDD.filter (justData => justData != header)

//Spark doesn't allow more than 22 element
case class crimeReport (Record_ID: Int, Agency_Name: String, City: String, State: String, Year: Int, Month: String, Crime_Type: String, Crime_Solved: String, Victim_Sex: String, Victim_Age: Int, Victim_Race: String, Perpetrator_Sex: String, Perpetrator_Age: Int, Perpetrator_Race: String, Relationship: String, Victim_Count: Int)

val data_split = data.map(line => line.split(","))

val allData = data_split.map(p => crimeReport(p(0).trim.toInt, p(1).trim.toString, p(2).trim.toString, p(3).trim.toString, p(4).trim.toInt, p(5).trim.toString, p(6).trim.toString, p(7).trim.toString, p(8).trim.toString, p(9).trim.toInt, p(10).trim.toString, p(11).trim.toString, p(12).trim.toInt, p(13).trim.toString,p(14).trim.toString, p(15).trim.toInt))

val allDF = allData.toDF()
allDF.printSchema
//allDF.show(100)

val rowsRDD = allDF.rdd.map(r => (r.getInt(0),r.getString(1),r.getString(2), r.getString(3),r.getInt(4), r.getString(5), r.getString(6), r.getString(7),r.getString(8), r.getInt(9), r.getString(10), r.getString(11),r.getInt(12), r.getString(13),r.getString(14), r.getInt(15)))

rowsRDD.cache()

val features_vector = allDF.rdd.map(r => Vectors.dense(r.getInt(0)))

features_vector.cache()

val KMeansModel = KMeans.train(features_vector,2,40)
但我犯了这个错误

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 43.0 failed 1 times, most recent failure: Lost task 0.0 in stage 43.0 (TID 57, localhost, executor driver): java.lang.NumberFormatException: For input string: "Jersey"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)
我不明白,因为我正在用这个功能清理白色和空白。修剪,是吗? 关键是抛出异常,因为在执行.toInt时存在一些字符串值,对吗?因为有65k行,所以我如何过滤它们呢

下面是一组数据:

Record ID,Agency Name,City,State,Year,Month,Crime Type,Crime Solved,Victim Sex,Victim Age,Victim Race,Perpetrator Sex,Perpetrator Age,Perpetrator Race,Relationship,Victim Count
1,Anchorage,Anchorage,Alaska,1980,January,Murder or Manslaughter,Yes,Male,14,Native American/Alaska Native,Male,15,Native American/Alaska Native,Acquaintance,0
13504,Atlantic City,Atlantic,Jersey,1980,January,Murder or Manslaughter,Yes,Male,40,Black,Female,50,Black,Acquaintance,0
13505,Atlantic City,Atlantic,Jersey,1980,January,Murder or Manslaughter,No,Male,23,Black,Unknown,0,Unknown,Unknown,0
13506,Atlantic City,Atlantic,Jersey,1980,January,Murder or Manslaughter,No,Male,52,White,Unknown,0,Unknown,Unknown,0
13507,Atlantic City,Atlantic,Jersey,1980,March,Murder or Manslaughter,Yes,Male,35,Black,Male,23,Black,Unknown,0
13508,Atlantic City,Atlantic,Jersey,1980,March,Murder or Manslaughter,No,Male,25,Black,Unknown,0,Unknown,Unknown,0
13647,Jersey City,Hudson,Jersey,1980,October,Murder or Manslaughter,No,Female,50,White,Unknown,0,Unknown,Unknown,2
13648,Jersey City,Hudson,Jersey,1980,March,Murder or Manslaughter,Yes,Female,60,White,Male,36,White,Father,1
13649,Jersey City,Hudson,Jersey,1980,June,Murder or Manslaughter,Yes,Female,52,Black,Male,26,Black,Unknown,1
13650,Jersey City,Hudson,Jersey,1980,October,Murder or Manslaughter,No,Male,2,White,Unknown,0,Unknown,Unknown,2
13651,Jersey City,Hudson,Jersey,1980,January,Murder or Manslaughter,Yes,Female,68,Black,Male,0,Black,Unknown,0
13652,Jersey City,Hudson,Jersey,1980,January,Murder or Manslaughter,Yes,Female,22,Black,Male,23,Black,Unknown,0
13653,Jersey City,Hudson,Jersey,1980,January,Murder or Manslaughter,Yes,Female,16,White,Male,33,White,Acquaintance,0
13654,Jersey City,Hudson,Jersey,1980,January,Murder or Manslaughter,Yes,Male,34,White,Male,18,White,Acquaintance,0
13655,Jersey City,Hudson,Jersey,1980,February,Murder or Manslaughter,No,Male,29,Black,Unknown,0,Unknown,Unknown,0
13656,Jersey City,Hudson,Jersey,1980,February,Murder or Manslaughter,No,Male,42,White,Unknown,0,Unknown,Unknown,0

是,当无法将
对象
强制转换为
整数
值时,将引发错误消息。 为什么不试试
选项
试试

比如说

Option(p(0).trim.toInt) getOrElse 0

这应该足以避免这种铸造错误

您在代码中提到,
case类
只支持22个元素。在较新版本的spark中,此限制已被删除。 我希望答案有帮助

编辑:

注意:
选项
仅捕获
空点异常
,因此不应解决强制转换异常
Try
处理几乎所有类型的
异常
,因此
Try
应该是强制执行异常的选项。

是的,当
对象
无法强制执行
整数
值时,会抛出错误消息。 为什么不试试
选项
试试

比如说

Option(p(0).trim.toInt) getOrElse 0

这应该足以避免这种铸造错误

您在代码中提到,
case类
只支持22个元素。在较新版本的spark中,此限制已被删除。 我希望答案有帮助

编辑:

注意:
选项
仅捕获
空点异常
,因此不应解决强制转换异常
Try
处理几乎所有类型的
异常,因此
Try
应该是引发异常的选项。

您可以使用
Try
来处理异常。您可以在scala中使用旧的Java风格
try/catch
try
的功能方式。下面是scala中处理异常的功能方法

Try(p(0).trim.toInt) match {
    case Success(result) => result  
    case Failure (ex) => {
      ex.printStackTrace()
      //return a default value as you want i have returned 0
      0
    }
  }
Try在语句通过时返回Success,在语句失败或发生异常时返回Failure。
我希望这更容易理解,也更实用。

您可以使用
Try
来处理异常。您可以在scala中使用旧的Java风格
try/catch
try
的功能方式。下面是scala中处理异常的功能方法

Try(p(0).trim.toInt) match {
    case Success(result) => result  
    case Failure (ex) => {
      ex.printStackTrace()
      //return a default value as you want i have returned 0
      0
    }
  }
Try在语句通过时返回Success,在语句失败或发生异常时返回Failure。
我希望这更容易理解,也更实用。

查找包含
Jersey
(示例中没有一个)的行,并检查它在清洁步骤后是如何保持的。可能某个地方有个bug(其中一个值包含字符串?)很抱歉,没有包含带有“Jersey”的行。现在,数据在转换后显示。关键是抛出异常,因为在执行.toInt时存在一些字符串值,对吗?那么,由于有65k行
我如何过滤它们呢?请尝试{data_split.map(p=>crimeReport(…)}.recover{case e e:Throwable=>logger.error(s“bad data:$p”);throw e}
查找包含
Jersey
的行(没有一个示例),并检查它在清理步骤后的状态。可能某个地方有个bug(其中一个值包含字符串?)很抱歉,没有包含带有“Jersey”的行。现在,数据在转换后显示。关键是抛出异常,因为在执行.toInt时存在一些字符串值,对吗?既然有65k行
Try{data_split.map(p=>crimeReport(…)}.recover{case e:Throwable=>logger.error(s“bad data:$p”);throw e}
这是非常糟糕的方法,因为它隐藏了问题。这是我所知道的最好的方法。如果我们想让问题变得明显(而不是隐藏),那么我们可以添加
匹配
案例
并抛出必要的异常。感谢所有人的帮助!最后,它与Try一起工作。有了Option,我仍然会犯同样的错误,但我不知道为什么,有人能告诉我原因吗?。目前,如果问题被隐藏起来,那还可以。@Borja,当然可以。我忘记了使用
选项
NullPointerException
只会被处理,而使用
Try
则会处理所有的
异常
。让我更新一下答案。这是非常糟糕的方法,因为它隐藏了问题。这是我所知道的最好的方法。如果我们想让问题变得明显(而不是隐藏),那么我们可以添加
匹配
案例
并抛出必要的异常。感谢所有人的帮助!最后,它与Try一起工作。有了Option,我仍然会犯同样的错误,但我不知道为什么,有人能告诉我原因吗?。目前,如果问题被隐藏起来,那还可以。@Borja,当然可以。我忘记了使用
选项
NullPointerException
只会被处理,而使用
Try
则会处理所有的
异常
。让我更新答案。