使用scala计算spark数据帧中列组合的实例

时间:2015-10-28 14:30:35

标签: scala apache-spark dataframe

我在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中的这种操作并不是最有经验的。

由于

迪安

2 个答案:

答案 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|