Ответ 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