Использование функции col () в pyspark - PullRequest
0 голосов
/ 05 апреля 2020

Описание проблемы:

В приведенном ниже примере кода (1) работает нормально, но (2) выдает ошибку. Я проверил параметры функций в их определении, как initcap (col), так и upper (col), что, я думаю, означает, что они будут принимать объект Column, так почему же разница в исполнении? Добавление col () upper () выполняется без ошибок.

Код для генерации данных:

from pyspark.sql import Row
from pyspark.sql.types import StructType , StructField , StringType 
from pyspark.sql.functions import col , upper , initcap
myRow = Row('this is spark')

myManualSchema = StructType([
StructField('Description',StringType())
])

myDF = spark.createDataFrame([myRow],myManualSchema)
myDF.show()

Код для репликации проблем

myDF.select(initcap('Description')).show(2)     # (1) Works Fine

myDF.select(upper('Description')).show(2)       # (2) Error

myDF.select(upper(col('Description'))).show(2)  # (3) Works Fine 

(1) Изображение для точки 1:

(2) Изображение для точки 2:

(3) Изображение для точки 3

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Если вы посмотрите документацию функций Spark SQL, вы увидите, что верхняя функция получает объект col, а не строку:

Документы Spark upper

0 голосов
/ 05 апреля 2020

Это ожидаемое поведение для функций upper(col) и lower(col). Если вы go через исходный код PySpark , вы увидите явное преобразование строки в столбец для функции initcap(col), но там нет оболочки Python, написанной для upper(col) и lower(col) functions.

def initcap(col):
    """Translate the first letter of each word to upper case in the sentence.
    >>> spark.createDataFrame([('ab cd',)['a']).select(initcap("a").alias('v')).collect()
    [Row(v=u'Ab Cd')]
    """
    sc = SparkContext._active_spark_context
    return Column(sc._jvm.functions.initcap(_to_java_column(col)))

Точно так же, если вы проверите базовый Scala код для вышеуказанных функций, вы увидите, что они принимают Column в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...