Следующий код находит максимальную длину всех столбцов в фрейме данных df.
Вопрос: как в приведенном ниже коде проверить максимальную длину только строковых столбцов?
from pyspark.sql.functions import col, length, max
df=df.select([max(length(col(name))) for name in df.schema.names])
Вы можете добавить условие, которое проверяет 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|
+---------------+---------------+
Вместо использования 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'])
Ваш ответ можно улучшить, добавив дополнительную информацию о том, что делает код и как он помогает ОП.
Ваш код работает с жестко закодированным примером (спасибо - мой голос). Но когда df загружается с файлом csv, он игнорирует оператор if. Для этого я разместил новый вопрос здесь