我的查詢就像
val demo = spark.sql(s"select PERCENTILE_APPROX(weight,array(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)) from db.demo_input_data")
scala> demo.first.getList(0)
res0: java.util.List[Nothing] = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
我的最終目標是從以下命令獲取資料
scala> val BenchmarkPercentile = ":10"
scala> demo.first.getList(0).map((x: Double) => x BenchmarkPercentile)
當我運行此命令時,出現以下錯誤
java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Double
at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:114)
at $anonfun$1.apply(<console>:31)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
... 51 elided
另一方面,如果我的資料集不同,如果我得到以下資料,命令作業正常
scala> val demo1 = spark.sql(s"select PERCENTILE_APPROX(weight,array(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)) from db.demo_input_data1")
scala> demo1.first.getList(0)
res1: java.util.List[Nothing] = [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]
請幫助我理解為什么會出現這種行為。
注意:-在運行上述代碼之前,我還發出了以下命令
scala> import scala.collection.JavaConversions._
uj5u.com熱心網友回復:
這里的問題是您需要處理正確的型別。我的意思是,您的 sql 查詢會創建一個具有特定模式的資料框。在您的情況下,您創建 demo1 資料框并獲取第一行。然后,第一列作為 java.util.List,因此您將資料框帶到 jvm(Scala 型別)世界。因為 Dataframe api 是無型別的,與 Dataset api 不同,您必須手動處理該型別不匹配:
demo.first.getList(0).map((x: BigDecimal) => x BenchmarkPercentile)
查看有關型別的 Spar 檔案:https ://spark.apache.org/docs/latest/sql-ref-datatypes.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474440.html
上一篇:獲取案例類引數型別作為HList
