2015-10-28 3 views
3

У меня есть искровой кадр данных в scala под названием df с двумя столбцами, скажем a и b. Столбец a содержит буквы и столбец b содержит числа, дающие ниже.Учет экземпляров комбинации столбцов в искровом фрейме с использованием scala

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.

Благодаря

Дин

ответ

5

Вы можете просто агрегировать и рассчитывать:

df.groupBy($"a", $"b").count 

или чуть более многословен:

import org.apache.spark.sql.functions.{count, lit} 

df.groupBy($"a", $"b").agg(count(lit(1)).alias("cnt")) 

Оба эквивалентны агрегации исходного SQL :

df.registerTempTable("df") 

sqlContext.sql("SELECT a, b, COUNT(1) AS cnt FROM df GROUP BY a, b") 
+0

Сво всегда просто, когда вы знаете это, но я не нахожу это тривиально, чтобы получить информацию. Я не хватает ресурса? Спасибо, кстати. Именно то, что я хотел. – Dean

+2

Я не знаю :) Может быть [Spark SQL и DataFrame Guide] (http://spark.apache.org/docs/latest/sql-programming-guide.html)? – zero323

+0

Еще раз спасибо. Они изменили поведение этого в 5.1! Урок, чтобы прочитать изменения. Принял ответ и попытался подняться, но не имеет репутации! – Dean

2

Также см Cross ТАБУЛИРОВАНИЯ

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| 
Смежные вопросы