Spark selectați coloana se întoarce de referință de vechi dataframe

0

Problema

Eu folosesc urmatorul cod:

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 la codul de mai sus am aștepta să conducă la o eroare, deoarece pentru test_df nu selectați masculin coloana de original dataframe. Surprinzător interogarea de mai sus ruleaza foarte bine fara nici o eroare și ieșiri următoarele:

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

Vreau sa inteleg logica din spatele a ceea ce scânteie este de a face. Ca pe o scânteie de documentare Selectați returnează un nou dataframe. Atunci de ce este încă în măsură de a utiliza masculin coloana de mamă dataframe.

2

Cel mai bun răspuns

3

Acest lucru este cauzat de DAG generate prin Scânteie. Unii operatori (sau transformers) e sunt leneși-a executat, astfel încât acestea să deschidă calea pentru o Scânteie pentru a optimiza DAG.

În acest exemplu, există două etape importante: select (sau project în SQL jargonul) în primul rând, și filter mai târziu. Dar, de fapt, la executarea, filter în primul rând, și apoi select, deoarece este mult mai eficient.

Puteți verifica această concluzie prin explain() metoda:

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

Se va afișa:

== 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

Adăugând la @chenzhongpu modelului răspuns, vă rugăm să rețineți că, dacă definiți o temp de vedere pe partea de sus a test_df, interogarea va eșua:

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
 _

...pentru o select (=Project nod în planul de execuție) este de gând să preceadă filtru (a încercat, prin intermediul where clauza).

2021-11-24 14:25:52

În alte limbi

Această pagină este în alte limbi

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