【问题标题】:Error when extracting features(spark)提取特征时出错(火花)
【发布时间】:2016-08-01 20:17:32
【问题描述】:

我在尝试从原始数据中提取特征时遇到了一些问题。

这是我的数据:

25,Private,226802,11th,7,Never-married,Machine-op-inspct,Own-child,Black,Male,0,0,40,United-States,0

这是我的代码:

val rawData = sc.textFile("data/myData.data")
val lines = rawData.map(_.split(","))
val categoriesMap = lines.map(fields => fields(1)).distinct.collect.zipWithIndex.toMap

这是错误信息:

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 1.0 failed 1 times, most recent failure: Lost task 1.0 in stage 1.0 (TID 3, localhost): java.lang.ArrayIndexOutOfBoundsException: 1

我想提取第二列作为分类特征,但似乎无法读取该列并导致 ArrayIndexOutOfBoundsException。 试了很多次还是不能解决问题。


val categoriesMap1 = lines.map(fields => fields(1)).distinct.collect.zipWithIndex.toMap
val labelpointRDD = lines.map { fields =>
    val categoryFeaturesArray1 = Array.ofDim[Double](categoriesMap1.size)
    val categoryIdx1 = categoriesMap1(fields(1))
    categoryFeaturesArray1(categoryIdx1) = 1 }

【问题讨论】:

  • 您可能无法阅读的原因是您的 csv 可能有缺失值。拆分后尝试调查数组的大小

标签: scala apache-spark apache-spark-mllib


【解决方案1】:

您的代码适用于您提供的示例 - 这意味着它适用于“有效”行 - 但您的输入可能包含一些无效行 - 在这种情况下,行没有逗号。

您可以清理数据或改进代码以更优雅地处理这些行,例如对坏行使用一些默认值:

val rawData = sc.parallelize(Seq(
  "25,Private,226802,11th,7,Never-married,Machine-op-inspct,Own-child,Black,Male,0,0,40,United-States,0",
  "BAD LINE"
))

val lines = rawData.map(_.split(","))
val categoriesMap = lines.map {
  case Array(_, s, _*) => s // for arrays with 2 or more items - use 2nd
  case _ => "UNKNOWN"       // default
}.distinct().collect().zipWithIndex.toMap

println(categoriesMap) // prints Map(UNKNOWN -> 0, Private -> 1)

更新:每个更新的问题 - 假设这些行确实无效,您可以完全跳过它们,无论是在提取类别映射还是映射到标记点时:

val secondColumn: RDD[String] = lines.collect {
  case Array(_, s, _*) => s // for arrays with 2 or more items - use 2nd
  // shorter arrays (bad records) will be ~~filtered out~~
}

val categoriesMap = secondColumn.distinct().collect().zipWithIndex.toMap
val labelpointRDD = secondColumn.map { field =>
  val categoryFeaturesArray1 = Array.ofDim[Double](categoriesMap.size)
  val categoryIdx1 = categoriesMap(field)
  categoryFeaturesArray1(categoryIdx1) = 1
  categoryFeaturesArray1
}

【讨论】:

  • @C.Y.Wu 这就是我的意思。
  • 好的,我试试这个。谢谢!
  • @eliasah 抱歉,我可以问一个额外的问题:如果我的数据中存在无效行,我如何将特征作为字符串获取?
  • @C.Y.Wu 我不确定你的意思。
  • @eliasah 就像我想取第二列,它返回字符串“Private”,但如果我使用lines.map(fields => fields(2)),就会发生错误。 .
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多