web-dev-qa-db-fra.com

Où devez-vous utiliser lit () dans Pyspark SQL?

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?

20
flybonzai

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
31
zero323

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é

0
Megha Jaiswal