在SQL中类似
SELECT count(id), sum(if(column1 = 1, 1, 0)) from groupedTable
可以制定为在单次传递中对总记录以及过滤记录进行计数。
如何在火花数据帧 API 中执行此操作?即无需将其中一个计数重新连接到原始数据帧。
只需在这两种情况下使用 count
:
df.select(count($"id"), count(when($"column1" === 1, true)))
如果列是nullable
则应更正(例如,根据所需的输出,使用 coalesce
或 IS NULL
)。
您可以尝试将 Spark 与 Hive 一起使用,因为 Hive 支持 SQL 的 sum if() 功能
首先,您需要使用以下代码在数据之上创建 Hive 表
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""")