繁体   English   中英

Spark SQL用于将两个不同查询的计数相除并将输出存储为Double

[英]Spark SQL for dividing count from two different queries and store the output as Double

我正在使用Scala开发Spark SQL。 我有一个要求,我需要首先将每个查询的o / p转换为double,然后再将它们除。这就是我尝试的方法。

查询1-

scala> var noofentry = sqlContext.sql("select count(*) from bankdata")
noofentry: org.apache.spark.sql.DataFrame = [count(1): bigint]

QUERY2

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)

在这样做时,我遇到了以下错误。

 java.lang.ClassCastException: java.lang.Long cannot be cast to 
 java.lang.Double
 at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:114)
 at org.apache.spark.sql.Row$class.getDouble(Row.scala:248)
 at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:165)... 50 elided

尽管我同意@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

因此,这实际上是同时进行代码审查和答案。

因为行中的值为Long ,所以您将收到ClassCastException ,但是您正在调用getDouble(0) ,它需要一个Double,如异常消息中所示:

无法将java.lang.Long强制转换为java.lang.Double

你需要调用getLong(0)然后再申请toDouble到龙为Double转换。 例如:

noofsubscribed.head().getLong(0).toDouble

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM