java.lang.NumberFormatException:对于输入字符串:“[14.8678]”

java.lang.NumberFormatException: For input string: "[14.8678]"

我有 Array[Row] 但实际上它总是只包含一个具有 Double 值的 Row。我想将这个 Double 值提取到参数 param1:

val q1 = spark.sql("SELECT PERCENTILE(price,0.25) FROM table").collect()

val param1 = q1.mkString(",").toDouble

但是我得到这个错误:

17/11/20 14:05:52 ERROR ApplicationMaster: User class threw exception: java.lang.NumberFormatException: For input string: "[14.8678]"

如何从 Array[Row] 获取号码。目前,我使用 collect(),但也许直接从 DataFrame 中获取数字更容易?

当您收集数据框时,它会为您提供一个 Array[Row],这些方括号是 Row 对象的一部分。

sqlContext.range(2).collect.foreach(println)
[0]
[1]

Row 对象具有预定义函数,如 getDoublegetStringgetDate 以从中获取值。

您在语义上还有以下选择:

sqlContext.range(2).withColumn("doub", $"id".cast("double") ).map(_.getDouble(1) ).collect
res3: Array[Double] = Array(0.0, 1.0)

sqlContext.range(2).withColumn("doub", $"id".cast("double") ).map(_.getAs[Double](1) ).collect
res4: Array[Double] = Array(0.0, 1.0)

sqlContext.range(2).withColumn("doub", $"id".cast("double") ).map(_.getAs[Double]("doub") ).collect
res5: Array[Double] = Array(0.0, 1.0)

sqlContext.range(2).withColumn("doub", $"id".cast("double") ).select("doub").as[Double].collect
res9: Array[Double] = Array(0.0, 1.0)