![](/img/trans.png)
[英]Results of rdd.count, count via spark sql are the same, but they are different from count with hive sql
[英]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.