Chispa seleccione la columna devuelve la referencia de edad dataframe

0

Pregunta

Yo uso el siguiente código:

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()

En el código anterior espero que se producirá un error debido a que para el test_df yo no seleccione el macho de la columna de la original dataframe. Sorprendentemente la consulta anterior funciona bien sin ningún error y las salidas de los siguientes:

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

Quiero entender la lógica detrás de lo que la chispa está haciendo. Como por la chispa de la documentación Select devuelve un nuevo dataframe. Entonces, ¿por qué todavía es capaz de utilizar el masculino columna de la matriz dataframe.

2

Mejor respuesta

3

Esto es causado por el DAG generado por Chispa. Algunos operadores (o transformers) es perezosa ejecutado, por lo que allanaría el camino para que la Chispa para optimizar el DAG.

En este ejemplo, hay dos pasos principales: select (o project en SQL de la jerga) primero, y filter más tarde. Pero en realidad, cuando se ejecuta, filter en primer lugar, y luego selectporque es más eficiente.

Usted puede verificar esta conclusión por explain() método:

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

Es la salida:

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

Agregar a @chenzhongpu 's respuesta, por favor, tenga en cuenta que si se define una temp ver en la parte superior de su test_dfla consulta se producirá un error:

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
 _

...porque un select (=Project nodo en el plan de ejecución) se va a preceder filtro (intentado a través de where cláusula).

2021-11-24 14:25:52

En otros idiomas

Esta página está en otros idiomas

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