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的主要内容,如果未能解决你的问题,请参考以下文章