Old classic SQL, interesting to see how it performs.
Using my own data, but demonstrating the point. Optimizer may re-write query.
val df = Seq(
( "A", "Bangalore", "a*.com", 1, "cpu" ),
( "A", "Bangalore", "a*.com", 9, "cpu" ),
( "A", "Bangalore", "a*.com", 7, "desktop" ),
( "C", "Bangalore", "a*.com", 0, "desktop" ),
( "C", "Bangalore", "a*.com", 0, "desktop" ),
( "D", "Bangalore", "a*.com", 0, "desktop" ),
( "D", "Bangalore", "a*.com", 0, "desktop" ),
( "D", "Bangalore", "a*.com", 0, "desktop" ),
( "B", "Bangalore", "a*.com", 5, "desktop" ),
( "B", "Bangalore", "a*.com", 0, "desktop" ),
( "B", "Bangalore", "a*.com", 19, "monitor" ),
).toDF("name" ,"address", "email", "floor", "resource")
df.createOrReplaceTempView("R")
val res = spark.sql("""
select *
from R
where R.name IN (
select X.name
from (select name, count(*)
from R
where floor = 0
group by name
having count(*) = 1 ) X
)
""")
res.show(false)
returns:
+----+---------+------+-----+--------+
|name|address |email |floor|resource|
+----+---------+------+-----+--------+
|B |Bangalore|a*.com|5 |desktop |
|B |Bangalore|a*.com|0 |desktop |
|B |Bangalore|a*.com|19 |monitor |
+----+---------+------+-----+--------+