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

时间:2017-11-20 13:49:11

标签: scala apache-spark spark-dataframe

我有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中获取数字可能更容易吗?

1 个答案:

答案 0 :(得分:1)

收集数据框时,它会为您提供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)