web-dev-qa-db-fra.com

Différence PySpark entre pyspark.sql.functions.col et pyspark.sql.functions.lit

J'ai du mal à comprendre la différence entre ces deux méthodes de pyspark.sql.functions car la documentation sur le site officiel de PySpark n'est pas très informative. Par exemple, le code suivant:

import pyspark.sql.functions as F
print(F.col('col_name'))
print(F.lit('col_name'))

Les résultats sont:

Column<b'col_name'>
Column<b'col_name'>

alors quelle est la différence entre les deux et quand dois-je utiliser l'un et pas l'autre?

8
Jing

Le doc dit:

col:

Renvoie une colonne basée sur le nom de colonne donné.

allumé:

Crée une colonne de valeur littérale


Dites si nous avons un bloc de données comme ci-dessous:

>>> import pyspark.sql.functions as F
>>> from pyspark.sql.types import *

>>> schema = StructType([StructField('A', StringType(), True)])
>>> df = spark.createDataFrame([("a",), ("b",), ("c",)], schema)
>>> df.show()
+---+
|  A|
+---+
|  a|
|  b|
|  c|
+---+

Si vous utilisez col pour créer une nouvelle colonne à partir de A:

>>> df.withColumn("new", F.col("A")).show()
+---+---+
|  A|new|
+---+---+
|  a|  a|
|  b|  b|
|  c|  c|
+---+---+

Donc col saisit une colonne existante avec le nom donné, F.col("A") est équivalent à df.A Ou df["A"] Ici.

Si vous utilisez F.lit("A") pour créer la colonne:

>>> df.withColumn("new", F.lit("A")).show()
+---+---+
|  A|new|
+---+---+
|  a|  A|
|  b|  A|
|  c|  A|
+---+---+

Tandis que lit créera une colonne constante avec la chaîne donnée comme valeurs.

Les deux retournent un objet Column mais le contenu et la signification sont différents.

16
Psidom