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

Posted

技术标签:

【中文标题】Spark SQL 用于从两个不同的查询中划分计数并将输出存储为 Double【英文标题】:Spark SQL for dividing count from two different queries and store the output as Double 【发布时间】:2018-03-22 10:09:06 【问题描述】:

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

查询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]

现在,我需要将每个查询的输出转换为双倍并除以它们。

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

【问题讨论】:

我不知道你为什么实际上是这样使用 count 的。 【参考方案1】:

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

所以这实际上是一个代码审查和一个答案。

【讨论】:

感谢您的快速回复。谢谢。 不客气!不要忘记接受答案请关闭问题 从银行数据中选择计数(*)会影响性能吗?或其他任何东西 不,这只是非常糟糕的做法。 您将您的值命名为“条目数”,但事实并非如此。因为您需要调用 head 来获取第一行并获取第一列【参考方案2】:

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

java.lang.Long 不能转换为 java.lang.Double

您需要先调用getLong(0),然后应用toDouble 将Long 转换为Double。例如:

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

【讨论】:

感谢您的快速回复。谢谢。

以上是关于Spark SQL 用于从两个不同的查询中划分计数并将输出存储为 Double的主要内容,如果未能解决你的问题,请参考以下文章

用于计数和显示(列中的不同值)的 Sql 查询优化,按其他两列分组

Spark sql 查询导致分区计数膨胀

SQL 查询 - 两个计数不同的粒度

为啥 Spark 以不同的方式解释这两个查询?

Microsoft Access SQL 查询计数不同

如何划分两个 Prometheus 计数器