Spark sélectionner la colonne de référence de retour de la vieille dataframe

0

La question

J'utilise le code suivant:

random = [("ABC",xx, 1), 
          ("DEF",yy,1), 
          ("GHI",zz, 0) 
         ]
randomColumns = ["name","id", "male"]
randomDF = spark.createDataFrame(data=random, schema = randomColumns)
test_df = randomDF.select("name", "id")
test_df.filter(f.col("male") == '1').show()

De le code ci-dessus je m'attends à provoquer une erreur parce que, pour la test_df je ne sélectionnez le mâle de la colonne à partir de l'original dataframe. Étonnamment, la requête ci-dessus fonctionne très bien sans aucune erreur et sorties suivantes:

+---------+-------+
|name     |     id|
+---------+-------+
|      abc|     xx|
|      def|     yy|
+---------+-------+

Je veux comprendre la logique derrière ce que l'étincelle est en train de faire. Comme par l'étincelle de la documentation Sélectionnez retourne une nouvelle dataframe. Alors pourquoi est-il toujours en mesure d'utiliser les hommes de la colonne de la mère dataframe.

2

La meilleure réponse

3

Ceci est causé par la DAG généré par Étincelle. Certains opérateurs (ou transformers) se sont paresseux exécuté, de sorte qu'ils ouvrent la voie pour le Spark pour optimiser la DAG.

Dans cet exemple, il y a deux grandes étapes: select (ou project dans SQL jargon des) tout d'abord, et filter plus tard. Mais en fait, lors de l'exécution, filter tout d'abord, et ensuite selectparce que c'est plus efficace.

Vous pouvez vérifier cette conclusion par explain() méthode:

test_df.filter(f.col("flag") == '1').explain()

Il sera de sortie:

== Physical Plan ==
*(1) Project [dept_name#0, dept_id#1L]
+- *(1) Filter (isnotnull(flag#2L) AND (flag#2L = 1))
   +- *(1) Scan ExistingRDD[dept_name#0,dept_id#1L,flag#2L]
2021-11-24 01:29:03
1

L'ajout de @chenzhongpu 's réponse, veuillez noter que si vous définissez une température de vue sur le dessus de votre test_df, la requête échoue:

test_df.createOrReplaceTempView("test_df")
spark.sql("select * from test_df where flag = 1").show()
_Traceback (most recent call last): ...
:
pyspark.sql.utils.AnalysisException: u"cannot resolve '`flag`' given input columns: [test_df.dept, test_df.id]; line 1 pos 24;
'Project [*]
 +- 'Filter ('flag = 1)
   +- SubqueryAlias `test_df`
      +- Project [dept#0, id#2L]
         +- LogicalRDD [dept#0, flag#1L, id#2L], false
 _

...parce qu'un select (=Project nœud dans le plan d'exécution) va précéder filtre (tentative de via where la clause).

2021-11-24 14:25:52

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................