在 Spark 中使用 groupBy 并返回到 DataFrame

Using groupBy in Spark and getting back to a DataFrame

我在使用 Scala 处理 spark 中的数据帧时遇到了困难。如果我有一个数据框,我想提取一列唯一条目,当我使用 groupBy 时,我没有得到数据框。

例如,我有一个名为 logs 的 DataFrame,其格式如下:

machine_id  | event     | other_stuff
 34131231   | thing     |   stuff
 83423984   | notathing | notstuff
 34131231   | thing    | morestuff

我想要唯一的机器 ID,其中事件是存储在新 DataFrame 中的东西,以便我可以进行某种过滤。使用

val machineId = logs
  .where($"event" === "thing")
  .select("machine_id")
  .groupBy("machine_id")

我得到了一组分组数据,使用起来很麻烦(或者我不知道如何正确使用这种对象)。获得此唯一机器 ID 列表后,我想使用它来过滤另一个 DataFrame 以提取单个机器 ID 的所有事件。

我可以看出我想经常做这种事情,基本工作流程是:

  1. 从日志中提取唯一 ID table。
  2. 使用唯一 ID 提取特定 ID 的所有事件。
  3. 对已提取的数据进行某种分析。

这是前两个步骤,希望能在这里提供一些指导。

我很欣赏这个例子有点做作,但希望它能解释我的问题。可能是我对 GroupedData 对象了解不够,或者(正如我所希望的那样)我在数据框中遗漏了一些使这变得容易的东西。我正在使用基于 Scala 2.10.4 构建的 spark 1.5。

谢谢

只需使用 distinct 而不是 groupBy:

val machineId = logs.where($"event"==="thing").select("machine_id").distinct

相当于SQL:

SELECT DISTINCT machine_id FROM logs WHERE event = 'thing'

GroupedData 不打算直接使用。它提供了很多方法,其中agg是最通用的,可用于应用不同的聚合函数并将其转换回DataFrame。就 SQL 而言,你在 wheregroupBy 之后的内容相当于这样的东西

SELECT machine_id, ... FROM logs WHERE event = 'thing' GROUP BY machine_id

其中 ... 必须由 agg 或等效方法提供。

在 spark 中分组,然后聚合,然后 select 语句将 return 一个数据框。对于您的示例,它应该类似于:

val machineId = logs
    .groupBy("machine_id", "event")
    .agg(max("other_stuff") )
    .select($"machine_id").where($"event" === "thing")