代码之家  ›  专栏  ›  技术社区  ›  vikash

scala中数组上的Distinct返回空字符串

  •  3
  • vikash  · 技术社区  · 8 年前

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

    在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
    

    如果我遗漏了什么,有人能告诉我吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Xavier Guihot    8 年前

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

    错误很可能来自此函数(应用于spark管道的开头):

    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的惰性丢失的地方,而不是map之类的转换)。

    推荐文章