Spark: "рассчитывать" на сгруппированные данные - это преобразование или действие? - PullRequest
0 голосов
/ 24 октября 2018

Я знаю, что count, вызываемый на RDD или DataFrame, является действием.Но, возясь с оболочкой искры, я заметил следующее

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 для GroupedData (empDF.groupBy("department")), в результате я получил еще один DataFrame (res1).Это приводит меня к мысли, что count в этом случае было преобразованием.Это также подтверждается тем фактом, что при вызове count не было запущено ни одного вычисления, вместо этого они начались, когда я запустил res1.show.

Я не смог найти никаких документов, предлагающих count может быть и трансформацией.Может ли кто-нибудь пролить свет на это?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Значение .count(), которое вы использовали в своем коде, превышает RelationalGroupedDataset, что создает новый столбец с количеством элементов в сгруппированном наборе данных.Это преобразование .См .: https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.sql.GroupedDataset

.count(), который вы обычно используете вместо RDD/DataFrame/Dataset, полностью отличается от вышеупомянутого, и этот .count() является действием .См .: https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.rdd.RDD

РЕДАКТИРОВАНИЕ:

всегда используйте .count() с .agg() при работе с groupedDataSet, чтобы избежать путаницы в будущем:

empDF.groupBy($"department").agg(count($"department") as "countDepartment").show
0 голосов
/ 24 октября 2018

Случай 1:

Вы используете rdd.count() для подсчета количества строк.Поскольку он инициирует выполнение DAG и возвращает данные драйверу, его действие для СДР.

для примера: rdd.count // it returns a Long value

Случай 2:

Если вы вызываете count для Dataframe, он инициирует выполнение DAG и возвращает данные драйверу, это действие для Dataframe.

для ex:df.count // it returns a Long value

Случай 3:

В вашем случае вы звоните groupBy на dataframe, который возвращает RelationalGroupedDataset объект, и вы звоните count для сгруппированного набора данных, который возвращает Dataframe, поэтому его преобразование , поскольку он не получает данные в драйвер и инициирует выполнение DAG.

для примера:

 df.groupBy("department") // returns RelationalGroupedDataset
          .count // returns a Dataframe so a transformation
          .count // returns a Long value since called on DF so an action
0 голосов
/ 24 октября 2018

Как вы уже выяснили - если метод возвращает распределенный объект (Dataset или RDD), его можно квалифицировать как преобразование.

Однако эти различия гораздо лучше подходят для СДР, чемDatasets.Последние содержат оптимизатор, в том числе недавно добавленный оптимизатор на основе затрат, и могут быть намного менее ленивыми по сравнению со старым API, в некоторых случаях стирая различия между преобразованием и действием.

Здесь, однако, можно с уверенностью сказать countэто трансформация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...