Pyspark - оператор if внутри select

Следующий код находит максимальную длину всех столбцов в фрейме данных df.

Вопрос: как в приведенном ниже коде проверить максимальную длину только строковых столбцов?

from pyspark.sql.functions import col, length, max

df=df.select([max(length(col(name))) for name in df.schema.names])
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
Learning Data Analytics Two: Filtering data in a DataFrame.
Learning Data Analytics Two: Filtering data in a DataFrame.
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
0
0
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете добавить условие, которое проверяет dataType из df.schema. Например:

from pyspark.sql.types import StringType

df = spark.createDataFrame(
    [
        (1, '2', '1'),
        (1, '4', '2'),
        (1, '2', '3'),
    ],
    ['col1','col2','col3']
)

df.select([
    max(length(col(schema.name))).alias(f'{schema.name}_max_length') 
    for schema in df.schema 
    if schema.dataType == StringType()
])
    
+---------------+---------------+
|col2_max_length|col3_max_length|
+---------------+---------------+
|              1|              1|
+---------------+---------------+

Ваш код работает с жестко закодированным примером (спасибо - мой голос). Но когда df загружается с файлом csv, он игнорирует оператор if. Для этого я разместил новый вопрос здесь

nam 21.02.2023 22:00

Вместо использования schema.names вы можете использовать schema.fields, который возвращает список StructField, который вы можете перебирать и получать имя и тип каждого поля.

df.select([max(length(col(field.name))) for field in df.schema.fields if field.dataType.typeName == "string"])
df = df.select([max(length(col(name))) for (name, type) in df.dtypes if type == 'string'])

Ваш ответ можно улучшить, добавив дополнительную информацию о том, что делает код и как он помогает ОП.

Tyler2P 18.02.2023 22:08

Другие вопросы по теме