Где вам нужно использовать lit() в Pyspark SQL?

Я пытаюсь понять, где вам нужно использовать значение lit, которое определяется как literal column в документации.

Возьмем, к примеру, этот udf, который возвращает индекс массива столбцов SQL:

def find_index(column, index):
    return column[index]

Если бы я передал целое число в это, я получил бы ошибку. Мне нужно передать значение lit(n) в udf, чтобы получить правильный индекс массива.

Есть ли место, где я могу лучше узнать жесткие и быстрые правила использования lit и, возможно, col?

Ответ 1

Для простоты вам нужен Column (может быть созданный с использованием lit, но это не единственный вариант), когда аналог JVM ожидает столбец, и в оболочке Python нет внутреннего преобразования или вы хотите вызвать Column специфический метод.

В первом случае единственное строгое правило относится к UDF. UDF (Python или JVM) можно вызывать только с аргументами типа Column. Это также обычно относится к функциям из pyspark.sql.functions. В других случаях всегда лучше проверять документацию и первые строки документации, а также, если этого недостаточно для документов соответствующего аналога Scala.

Во втором случае правила просты. Если вы, например, хотите сравнить столбец со значением, тогда значение должно быть в RHS:

col("foo") > 0  # OK

или значение должно быть заключено в литерал:

lit(0) < col("foo")  # OK

В Python многие операторы (<, ==, <=, &, |, +, -, *, /) могут использовать объект не столбца в LHS:

0 < col("foo") 

но такие приложения не поддерживаются в Scala.

Само собой разумеется, что вы должны использовать lit, если хотите получить доступ к любому из методов pyspark.sql.Column, рассматривая стандартный скаляр Python как постоянный столбец. Например, вам понадобится

c = lit(1)

не

c = 1

на

c.between(0, 3)  # type: pyspark.sql.Column

Ответ 2

Простой пример может быть:

df.withColumn("columnName", lit(Column_Value ))

например:

df = df.withColumn("Today Date", lit(datetime.now()))

Но сначала импортируйте библиотеку: из pyspark.sql.functions импорт горит