同一查询中的火花计数和过滤计数
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
,则应进行更正(例如使用 coalesce
或 IS 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 和计数的组)