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

Scala java.lang.NumberFormatException:对于输入字符串:";[14.8678]”;,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有Array[Row],但实际上它总是只包含一个带有双值的行。我想将此双精度值提取到参数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: j

我有
Array[Row]
,但实际上它总是只包含一个带有双值的
行。我想将此双精度值提取到参数
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]"

如何从
数组[行]
中获取数字。目前,我使用的是
collect()
,但直接从数据帧中获取数字可能更容易些?

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

sqlContext.range(2).collect.foreach(println)
[0]
[1]
Row
对象具有预定义的函数,如
getDouble
getString
getDate
,以从中获取值

在语义上,您还可以选择以下选项:

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)

spark.sql(“从表中选择百分位(价格,0.25”).map(u.getDouble(0)).collect
@philantrovert:这给了我
Array[Double]
如果其中只有一个值,请将其更改为
collect.apply(0)
@philantrovert:谢谢!你能发布你的答案让我接受吗?我选择:
val q1=spark.sql(“从活动产品中选择百分位(价格,0.25”).map(\uu.getDouble(0)).collect.apply(0)
。但是如果
price
为空或
null
,会发生什么呢?那么不要使用
getDouble
。所有其他方法都应该在
price
NULL
的地方提供
0.0
。你的意思是我应该使用
getString
而不是
getDouble
?不,使用
getAs[Double]
。它将为您进行选择。
spark.sql(“从活动产品中选择百分位数(价格,0.25”)).map(u.getAs[Double])。collect.apply(0)
。现在无法编译它。