scala中数组的区别是返回一个空字符串

时间:2018-03-18 21:50:46

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

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

在火花壳上,当我尝试这个时:

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 个答案:

答案 0 :(得分:1)

它很可能来自您输入中的一行,其中您要转换为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的懒惰所在迷失了 - 而不是像地图这样的转换。)