我正在使用Scala处理Spark SQL。我有一个要求,我需要先将每个查询的o / p转换为double然后再将它们分开。这就是我试过的。
查询1 -
"_id" : ObjectId("5ab3714bb57dce13040024c3"),
"name" : "16floor",
"date" : ISODate("2018-03-22T09:03:07.147Z"),
"data" : [
{
"value" : 169
},
{
"value" : 200
},
{
"value" : 80
},
.
.
.
QUERY2
scala> var noofentry = sqlContext.sql("select count(*) from bankdata")
noofentry: org.apache.spark.sql.DataFrame = [count(1): bigint]
现在,我需要将每个查询的输出转换为double并将它们分开。
var noofsubscribed = sqlContext.sql("select count(*) from bankdata where y='yes'")
noofsubscribed: org.apache.spark.sql.DataFrame = [count(1): bigint]
在执行此操作时,我最终遇到以下错误。
scala > var result = noofsubscribed.head().getDouble(0) / noofentry.head().getDouble(0)
答案 0 :(得分:2)
尽管我同意@DNA的答案,但我想以另一种方式攻击这个问题,或许考虑最佳实践。
执行以下操作毫无意义:
scala> var noofentry = sqlContext.sql("select count(*) from bankdata")
你应该做以下事情:
scala> val noofentry = sqlContext.sql("select * from bankdata").count
其他查询也是如此:
scala> val noofsubscribed = sqlContext.sql("select * from bankdata where y='yes'").count
现在你只需转换其中一个:
scala > val result = noofsubscribed.toDouble / noofentry
所以这实际上是代码审查和答案。
答案 1 :(得分:1)
您收到ClassCastException
,因为您的行中的值是Long
,但您正在调用getDouble(0)
,它需要Double,如异常消息中所示:
java.lang.Long无法强制转换为java.lang.Double
您需要先调用getLong(0)
,然后应用toDouble
将Long转换为Double。例如:
noofsubscribed.head().getLong(0).toDouble