【问题标题】:Distinct on an array in scala returns an empty stringscala中数组的不同返回一个空字符串
【发布时间】:2018-08-27 10:27:21
【问题描述】:

我正在尝试从 GitHub 中的这段代码 click here 学习 graphx

在 spark-shell 上,当我尝试这个时:

def parseFlight(str: String): Flight = {
  val line = str.split(",")
  Flight(line(0), line(1), line(2), line(3), line(4).toInt, line(5).toLong, line(6), line(7).toLong, line(8), line(9).toDouble, line(10).toDouble, line(11).toDouble, line(12).toDouble, line(13).toDouble, line(14).toDouble, line(15).toDouble, line(16).toInt)
}

val textRDD = sc.textFile("/user/user01/data/rita2014jan.csv")

val flightsRDD = textRDD.map(parseFlight).cache()

val airports = flightsRDD.map(flight => (flight.org_id, flight.origin)).distinct

airports.take(1)

我得到了这个指向airports.take(1)的异常:

java.lang.NumberFormatException: empty String

如果我遗漏了什么,谁能告诉我?

【问题讨论】:

    标签: scala apache-spark bigdata spark-graphx databricks


    【解决方案1】:

    它很可能来自您输入中的一行,其中您要转换为 Double 的字段为空。

    错误最有可能来自这个函数(在火花管道的开头应用):

    def parseFlight(str: String): Flight = {
      val line = str.split(",")
      Flight(line(0), line(1), line(2), line(3), line(4).toInt, line(5).toLong, line(6), line(7).toLong, line(8), line(9).toDouble, line(10).toDouble, line(11).toDouble, line(12).toDouble, line(13).toDouble, line(14).toDouble, line(15).toDouble, line(16).toInt)
    }
    

    在某些时候,.toDouble 将应用于 ""(一个空字符串)。


    例如,您可以通过这样做重现相同的错误:

    "aa,,,s".split(",")(2).toDouble
    

    产生:

    java.lang.NumberFormatException: empty String
    

    该错误导致您认为它来自包含 airports.take(1) 的行,因为它是包含管道的第一个 action 的行(这是 RDD 的惰性丢失的地方 - 而不是这样的转换作为地图)。

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 2022-01-20
      • 2018-08-15
      • 2019-01-28
      • 2015-05-14
      • 1970-01-01
      • 2019-10-29
      • 2011-02-04
      • 1970-01-01
      相关资源
      最近更新 更多