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)
。现在无法编译它。