web-dev-qa-db-fra.com

Spark dataframe: collect () vs select ()

L'appel de collect() sur un RDD renverra l'intégralité du jeu de données au pilote, ce qui peut entraîner une insuffisance de mémoire et nous devrions éviter cela.

collect() se comportera-t-il de la même manière si appelé sur une base de données?
Qu'en est-il de la méthode select()?
Cela fonctionne-t-il également de la même manière que collect() s’il est appelé sur une trame de données?

10
Mrinal

Actions vs Transformations

  • Collect (Action) - Renvoie tous les éléments du jeu de données sous forme de tableau dans le programme du pilote. Ceci est généralement utile après un filtre ou autre opération qui renvoie un sous-ensemble suffisamment petit des données.

spark-sql doc

select (* cols) (transformation) - Projette un ensemble d'expressions et renvoie un nouveau DataFrame.

Paramètres: cols - liste des noms de colonne (chaîne) ou des expressions (Colonne). Si l’un des noms de colonne est ‘*’, cette colonne est développée d'inclure toutes les colonnes dans le DataFrame en cours. **

df.select('*').collect()
[Row(age=2, name=u'Alice'), Row(age=5, name=u'Bob')]
df.select('name', 'age').collect()
[Row(name=u'Alice', age=2), Row(name=u'Bob', age=5)]
df.select(df.name, (df.age + 10).alias('age')).collect()
[Row(name=u'Alice', age=12), Row(name=u'Bob', age=15)]

La méthode select(column-name1,column-name2,etc) d’exécution sur une trame de données renvoie une nouvelle trame contenant uniquement les colonnes sélectionnées dans la fonction select().

par exemple. en supposant que df a plusieurs colonnes incluant "nom" et "valeur" et quelques autres.

df2 = df.select("name","value")

df2 ne contiendra que deux colonnes ("nom" et "valeur") sur les colonnes entières de df

df2 à la suite de select sera dans les exécuteurs et non dans le pilote (comme dans le cas de l'utilisation de collect())

sql-programming-guide

df.printSchema()
# root
# |-- age: long (nullable = true)
# |-- name: string (nullable = true)

# Select only the "name" column
df.select("name").show()
# +-------+
# |   name|
# +-------+
# |Michael|
# |   Andy|
# | Justin|
# +-------+

Vous pouvez exécuter collect() sur une image ( spark docs )

>>> l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]

spark docs

Pour imprimer tous les éléments du pilote, vous pouvez utiliser la méthode collect () pour amener d’abord le RDD au nœud du pilote de la manière suivante: rdd.collect (). foreach (println). Cela peut entraîner l’épuisement du pilote de mémoire, cependant, parce que collect () récupère l’ensemble du RDD en un machine unique; si vous n’avez besoin que d’imprimer quelques éléments du RDD, un Une approche plus sûre consiste à utiliser le take (): rdd.take (100) .foreach (println).

20
Yaron

appeler select entraînera une évaluation lazy: par exemple:

val df1 = df.select("col1")
val df2 = df1.filter("col1 == 3")

les deux instructions ci-dessus créent un chemin paresseux qui sera exécuté lorsque vous appelez une action sur cette df, telle que show, collect etc.

val df3 = df2.collect()

utilisez .explain à la fin de votre transformation pour suivre son plan voici des informations plus détaillées Transformations and Actions

3
Karol Sudol

Select est utilisé pour projeter tout ou partie des dataframe. Cela ne vous donnera pas une value comme sortie mais une nouvelle dataframe. C'est une transformation.

2
Rajat Mishra