首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星星之火:“依靠”分组数据是一种转换还是一种行动?

星星之火:“依靠”分组数据是一种转换还是一种行动?
EN

Stack Overflow用户
提问于 2018-10-24 10:10:27
回答 3查看 6.2K关注 0票数 14

我知道count调用RDD或DataFrame是一种操作。但是,当我摆弄火花壳时,我观察到以下情况

代码语言:javascript
复制
scala> val empDF = Seq((1,"James Gordon", 30, "Homicide"),(2,"Harvey Bullock", 35, "Homicide"),(3,"Kristen Kringle", 28, "Records"),(4,"Edward Nygma", 30, "Forensics"),(5,"Leslie Thompkins", 31, "Forensics")).toDF("id", "name", "age", "department")
empDF: org.apache.spark.sql.DataFrame = [id: int, name: string, age: int, department: string]

scala> empDF.show
+---+----------------+---+----------+
| id|            name|age|department|
+---+----------------+---+----------+
|  1|    James Gordon| 30|  Homicide|
|  2|  Harvey Bullock| 35|  Homicide|
|  3| Kristen Kringle| 28|   Records|
|  4|    Edward Nygma| 30| Forensics|
|  5|Leslie Thompkins| 31| Forensics|
+---+----------------+---+----------+

scala> empDF.groupBy("department").count //count returned a DataFrame
res1: org.apache.spark.sql.DataFrame = [department: string, count: bigint]

scala> res1.show
+----------+-----+                                                              
|department|count|
+----------+-----+
|  Homicide|    2|
|   Records|    1|
| Forensics|    2|
+----------+-----+

当我调用count on GroupedData (empDF.groupBy("department"))时,得到了另一个DataFrame作为结果(res1)。这使我相信,在这种情况下,count是一种转换。它还得到以下事实的支持:当我调用count时没有触发计算,而是在我运行res1.show时启动计算。

我还没有找到任何说明count也可能是一种转换的文档。有人能帮我解释一下这件事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-24 10:34:36

您在代码中使用的.count()是通过RelationalGroupedDataset创建的,它创建了一个新列,其中包含分组数据集中的元素计数。这是一个transformation.参考:https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.sql.GroupedDataset

您通常在RDD/DataFrame/Dataset上使用的RDD/DataFrame/Dataset与上面的完全不同,这个.count()是一个操作。参考:https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.rdd.RDD

编辑:

在对.count()进行操作时,始终将.agg()与groupedDataSet一起使用,以避免将来出现混淆:

代码语言:javascript
复制
empDF.groupBy($"department").agg(count($"department") as "countDepartment").show
票数 14
EN

Stack Overflow用户

发布于 2018-10-24 10:36:45

案例1:

您可以使用rdd.count()来计数行数。因为它启动DAG执行并将数据返回给驱动程序,所以它是RDD的操作

ex:rdd.count // it returns a Long value

案例2:

如果您调用count on Dataframe,它将启动DAG执行并将数据返回给驱动程序,它是一个用于Dataframe的操作

ex:df.count // it returns a Long value

案例3:

在您的示例中,您在返回transformation对象的dataframe上调用groupBy,在分组数据集上调用count,该数据集返回Dataframe,因此它是一个Dataframe,因为它不会将数据发送给驱动程序并启动DAG执行。

前任:

代码语言:javascript
复制
 df.groupBy("department") // returns RelationalGroupedDataset
          .count // returns a Dataframe so a transformation
          .count // returns a Long value since called on DF so an action
票数 7
EN

Stack Overflow用户

发布于 2018-10-24 10:15:57

正如您已经知道的-如果方法返回一个分布式对象(DatasetRDD),它可以限定为转换。

然而,与数据集相比,这些区别更适合于RDD。后者具有一个优化器,包括最近添加的基于成本的优化器,并且可能大大减少旧API的惰性,在某些情况下模糊了转换和操作之间的差异。

不过,在这里可以肯定地说,count是一种转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52966347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档