Scala Spark SQL用于将两个不同查询的计数除以,并将输出存储为Double
我正在使用Scala开发Spark SQL。我有一个要求,我需要首先将每个查询的o/p转换为double,然后将它们分开。这就是我尝试的 问题1-Scala Spark SQL用于将两个不同查询的计数除以,并将输出存储为Double,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在使用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] 问题2 var noofsubscribed = sqlContext.sq
scala> var noofentry = sqlContext.sql("select count(*) from bankdata")
noofentry: org.apache.spark.sql.DataFrame = [count(1): bigint]
问题2
var noofsubscribed = sqlContext.sql("select count(*) from bankdata where y='yes'")
noofsubscribed: org.apache.spark.sql.DataFrame = [count(1): bigint]
现在,我需要将每个查询的输出转换为double,并将它们分开
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
您将获得一个
ClassCastException
,因为行中的值是Long
,但您正在调用getDouble(0)
,它需要一个Double,如异常消息所示:
无法将java.lang.Long转换为java.lang.Double
您需要先调用getLong(0)
,然后应用toDouble
将Long转换为Double。例如:
noofsubscribed.head().getLong(0).toDouble
您将获得一个
ClassCastException
,因为行中的值是Long
,但您正在调用getDouble(0)
,它需要一个Double,如异常消息所示:
无法将java.lang.Long转换为java.lang.Double
您需要先调用getLong(0)
,然后应用toDouble
将Long转换为Double。例如:
noofsubscribed.head().getLong(0).toDouble
虽然我非常同意@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
因此,这实际上是一个代码审查,同时也是一个答案。虽然我同意@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
因此,这实际上是一个代码检查,同时也是一个答案。我不确定您为什么要用这种方式使用计数。我不确定您为什么要用这种方式使用计数。我感谢您的快速响应。谢谢。不客气!不要忘记接受答案请关闭问题从bankdata执行select count(*)是否会影响性能?或者其他任何东西。这只是一种非常糟糕的做法。你把你的值命名为“条目数”,但事实并非如此。因为你需要亲自拜访才能拿到第一行和第一列。我感谢你的快速回复。谢谢。不客气!不要忘记接受答案请关闭问题从bankdata执行select count(*)是否会影响性能?或者其他任何东西。这只是一种非常糟糕的做法。你把你的值命名为“条目数”,但事实并非如此。因为你需要亲自拜访才能拿到第一行和第一列。我感谢你的快速回复。谢谢。我感谢你的快速回复。谢谢。