我在scala中有一个名为df的火花数据框,有两列,比如a和b。 a列包含字母,b列包含下面的数字。
a b
----------
g 0
f 0
g 0
f 1
我可以使用
获取不同的行val dfDistinct=df.select("a","b").distinct
给出以下内容:
a b
----------
g 0
f 0
f 1
我想添加另一个列,其中包含这些不同组合在第一个数据帧中出现的次数,所以我最终得到了
a b count
----------
g 0 2
f 0 1
f 1 1
我不介意是否修改了原始命令,或者我对dfDistinct进行了单独的操作,给出了另一个数据框。
任何建议都非常感谢,我为这个问题的微不足道的性质道歉,但我对scala或spark中的这种操作并不是最有经验的。
由于
迪安
答案 0 :(得分:9)
您可以简单地汇总和计算:
WITH dis AS
(
SELECT EntityID, Year, SUM(Amount) AS ammount
FROM Disbursements
WHERE YEAR >= YEAR(GETDATE())-3
GROUP BY EntityID, Year
),
eyear AS
(
SELECT e.EntityId, Year
FROM Disbursements
JOIN Entity AS e
ON Year >= YEAR(GETDATE())-3
GROUP BY e.FundraisingEntityId, Year
)
SELECT distinct E.EntityId, d.amount this_year, d1.amount AS last_year, d2.amount AS two_years_back, d3.amount AS three_years_back
FROM eyear E
LEFT JOIN dis d ON E.EntityId = d.EntityId AND d.Year = YEAR(GETDATE())
LEFT JOIN dis d1 ON E.EntityId = d1.EntityId AND d1.Year = YEAR(GETDATE())-1
LEFT JOIN dis d2 ON E.EntityId = d2.EntityId AND d2.Year = YEAR(GETDATE())-2
LEFT JOIN dis d3 ON E.EntityId = d3.EntityId AND d3.Year = YEAR(GETDATE())-3
或者更详细一点:
df.groupBy($"a", $"b").count
两者都等同于原始SQL聚合:
import org.apache.spark.sql.functions.{count, lit}
df.groupBy($"a", $"b").agg(count(lit(1)).alias("cnt"))
答案 1 :(得分:2)
另见Cross Tabulation
val g="g"
val f = "f"
val df = Seq(
(g, "0"),
(f, "0"),
(g, "0"),
(f, "1")
).toDF("a", "b")
val res = df.stat.crosstab("a","b")
res.show
+---+---+---+
|a_b| 0| 1|
+---+---+---+
| g| 2| 0|
| f| 1| 1|