J'essaie de comprendre où vous devez utiliser une valeur lit
, qui est définie comme un literal column
Dans la documentation.
Prenons par exemple ce udf
, qui retourne l'index d'un tableau de colonnes SQL:
def find_index(column, index):
return column[index]
Si je devais passer un entier dans cela, j'obtiendrais une erreur. J'aurais besoin de passer une valeur lit(n)
dans le udf pour obtenir l'index correct d'un tableau.
Y a-t-il un endroit où je peux mieux apprendre les règles strictes et rapides de l'utilisation de lit
et éventuellement col
?
Pour rester simple, vous avez besoin d'un Column
(qui peut être créé à l'aide de lit
mais ce n'est pas la seule option) lorsque l'homologue JVM attend une colonne et qu'il n'y a pas de conversion interne dans un Python ou vous voulez appeler une méthode spécifique Column
.
Dans le premier cas, la seule règle stricte est l'activation des UDF. UDF (Python ou JVM) ne peut être appelé qu'avec des arguments de type Column
. Il s'applique également généralement aux fonctions de pyspark.sql.functions
. Dans d'autres cas, il est toujours préférable de vérifier d'abord la documentation et les chaînes de documents et s'il n'y a pas suffisamment de documents d'un homologue Scala correspondant.
Dans le second cas, les règles sont simples. Si vous voulez par exemple comparer une colonne à une valeur, alors la valeur doit être sur le RHS:
col("foo") > 0 # OK
ou la valeur doit être entourée de littéral:
lit(0) < col("foo") # OK
Dans Python de nombreux opérateurs (<
, ==
, <=
, &
, |
, +
, -
, *
, /
) Peuvent utiliser un objet non colonne sur le LHS:
0 < col("foo")
mais ces applications ne sont pas prises en charge dans Scala.
Il va sans dire que vous devez utiliser lit
si vous voulez accéder à l'une des méthodes pyspark.sql.Column
en traitant le scalaire Python standard comme ne colonne constante . Par exemple, vous aurez besoin
c = lit(1)
ne pas
c = 1
à
c.between(0, 3) # type: pyspark.sql.Column
un exemple simple pourrait être:
df.withColumn("columnName", lit(Column_Value ))
ex:
df = df.withColumn("Today's Date", lit(datetime.now()))
Mais première bibliothèque d'importation: à partir de pyspark.sql.functions import allumé