Scala 在Spark中使用groupBy并返回数据帧
使用Scala在spark中处理数据帧时遇到困难。如果我有一个数据框,我想提取一列唯一的条目,当我使用Scala 在Spark中使用groupBy并返回数据帧,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,使用Scala在spark中处理数据帧时遇到困难。如果我有一个数据框,我想提取一列唯一的条目,当我使用groupBy时,我不会返回数据框 例如,我有一个名为logs的DataFrame,其形式如下: machine_id | event | other_stuff 34131231 | thing | stuff 83423984 | notathing | notstuff 34131231 | thing | morestuff 我希望将事件存
groupBy
时,我不会返回数据框
例如,我有一个名为logs的DataFrame
,其形式如下:
machine_id | event | other_stuff
34131231 | thing | stuff
83423984 | notathing | notstuff
34131231 | thing | morestuff
我希望将事件存储在新的数据帧中的唯一机器ID允许我进行某种过滤。使用
val machineId = logs
.where($"event" === "thing")
.select("machine_id")
.groupBy("machine_id")
我得到了分组数据的val,这是一个很难使用的问题(或者我不知道如何正确使用这种对象)。得到了这个唯一机器id的列表后,我想在过滤另一个DataFrame
时使用它来提取各个机器id的所有事件
我可以看出我希望定期做这类事情,基本工作流程是:
从日志表中提取唯一id
使用唯一id提取特定id的所有事件
对已提取的数据进行某种分析李>
这是前两个步骤,我希望在这里得到一些指导
我理解这个例子有点做作,但希望它能解释我的问题所在。这可能是因为我对GroupedData
对象了解不够,或者(我希望如此)我在数据帧中遗漏了一些使这变得容易的东西。我使用的是Scala 2.10.4上构建的spark 1.5
谢谢只需使用distinct
而不是groupBy
:
val machineId = logs.where($"event"==="thing").select("machine_id").distinct
这将相当于SQL:
从日志中选择不同的机器\u id,其中event='thing'
GroupedData
不打算直接使用。它提供了许多方法,其中agg
是最通用的方法,可用于应用不同的聚合函数并将其转换回DataFrame
。在SQL方面,您在where
和groupBy
之后所拥有的内容相当于这样的内容
选择机器id。。。从日志中,事件='thing'按机器id分组
其中,..
必须通过agg
或等效方法提供。一个group by in spark,后跟聚合,然后一个select语句将返回一个数据帧。对于您的示例,它应该类似于:
val machineId = logs
.groupBy("machine_id", "event")
.agg(max("other_stuff") )
.select($"machine_id").where($"event" === "thing")