同一查询中的火花计数和过滤计数

Posted

技术标签:

【中文标题】同一查询中的火花计数和过滤计数【英文标题】:spark count and filtered count in same query 【发布时间】:2017-02-02 13:34:43 【问题描述】:

在 SQL 中类似于

SELECT  count(id), sum(if(column1 = 1, 1, 0)) from groupedTable

可以制定为一次性计算总记录数和过滤记录数。

如何在 spark-data-frame API 中执行此操作?即无需将其中一个计数加入原始数据帧。

【问题讨论】:

您是否尝试使用 CASE ... WHEN 运行此查询? 您可以使用registerTempTable 将数据帧注册为临时表,并按照@T.Gawęda 的建议在sql 查询中使用CASE ... WHEN 语句。 我知道应该可以。但是是否有可能留在更安全的 scala-spark-dataframe api 中? @GeorgHeiler 您可以使用类型化 API:spark.apache.org/docs/latest/api/scala/… 【参考方案1】:

两种情况都使用count

df.select(count($"id"), count(when($"column1" === 1, true)))

如果列是 nullable,则应进行更正(例如使用 coalesceIS NULL,具体取决于所需的输出)。

【讨论】:

【参考方案2】:

您可以尝试将 spark 与 hive 一起使用,因为 hive 支持 SQL 的 sum if() 功能

首先,您需要使用以下代码在数据之上创建配置单元表

val conf = new SparkConf().setAppName("Hive_Test")
val sc = new SparkContext(conf)
//Creation of hive context      
val hsc = new HiveContext(sc)

import spark.implicits._
import spark.sql

hsc.sql("CREATE TABLE IF NOT EXISTS emp (id INT, name STRING)")

hsc.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/test.txt' INTO TABLE emp")


hsc.sql("""select count(id), SUM(v)
from (
select id, IF(name=1, count(*), 0) AS v
from emp
where id>0
group by id,name
) t2""")

【讨论】:

以上是关于同一查询中的火花计数和过滤计数的主要内容,如果未能解决你的问题,请参考以下文章

查询用于创建分组、聚合和过滤的行集的不同计数

Grafana:SQL 查询 - 将“过滤器”应用于“计数”

使用 $match 和 $group 的 mongoDB 查询(过滤过去 24 小时记录的数据和具有 id 和计数的组)

实体框架 DbContext 过滤的计数查询使用变量非常慢

Django:结合来自两个过滤器查询的两个计数注释

PHP按类别过滤搜索结果并计数