Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark SQL用于将两个不同查询的计数除以,并将输出存储为Double_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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

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开发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.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(*)是否会影响性能?或者其他任何东西。这只是一种非常糟糕的做法。你把你的值命名为“条目数”,但事实并非如此。因为你需要亲自拜访才能拿到第一行和第一列。我感谢你的快速回复。谢谢。我感谢你的快速回复。谢谢。