Spark SQL用于从两个不同的查询中划分计数,并将输出存储为Double

时间:2018-03-22 10:09:06

标签: scala apache-spark apache-spark-sql

我正在使用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)

2 个答案:

答案 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