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?
- 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.
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()
)
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)]
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).
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
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
.