Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Spark中使用groupBy并返回数据帧_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 在Spark中使用groupBy并返回数据帧

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 我希望将事件存

使用Scala在spark中处理数据帧时遇到困难。如果我有一个数据框,我想提取一列唯一的条目,当我使用
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")