У меня есть столбец PySpark, который состоит из строк и списков, тип данных этого столбца — строка, string (nullable = true)
, я хочу изменить его, чтобы он состоял только из списков, и преобразовать все, что не является списком, в NULL
.
Я пробовал этот код:
df.select(F.split(F.col("major_options"),",")).alias('major_options').show()
но вместо этого он создаст список из всего, а не изменит существующий тип данных списка. Я также пробовал использовать метод cast
, но получил эту ошибку:
AnalysisException: [DATATYPE_MISMATCH.CAST_WITHOUT_SUGGESTION] Невозможно разрешить «major_options» из-за несоответствия типа данных: невозможно привести «STRING» к «ARRAY».
Обновлено: вот как выглядит столбец:
|['Alloy Wheels'] |
|['Light Package', 'Alloy Wheels', 'Bluetooth'] |
|Steering wheel memory |
|Knee airbag |
|['Sunroof/Moonroof', 'Alloy Wheels', 'Bluetooth', 'Parking Sensors'] |
|['Alloy Wheels', 'Bluetooth'] |
и вот как я хочу, чтобы это выглядело:
|['Alloy Wheels'] |
|['Light Package', 'Alloy Wheels', 'Bluetooth'] |
|NULL |
|NULL |
|['Sunroof/Moonroof', 'Alloy Wheels', 'Bluetooth', 'Parking Sensors'] |
|['Alloy Wheels', 'Bluetooth'] |
Вы можете использовать regexp_extract, чтобы проверить, содержит ли строка открывающие и закрывающие квадратные скобки, а затем соответствующим образом разделить ее следующим образом:
from pyspark.sql import SparkSession
from pyspark.sql.functions import split, when, col, lit, regexp_extract
spark = SparkSession.builder.getOrCreate()
data = [
("['Alloy Wheels']",),
("['Light Package', 'Alloy Wheels', 'Bluetooth']",),
("Steering wheel memory",),
("Knee airbag",),
("['Sunroof/Moonroof', 'Alloy Wheels', 'Bluetooth', 'Parking Sensors']",),
("['Alloy Wheels', 'Bluetooth']",),
]
df = spark.createDataFrame(data, ["major_options"])
print("original schema:")
df.printSchema()
print("original df:")
df.show(truncate=False)
df = df.withColumn(
"major_options",
when(
regexp_extract(col("major_options"), r"^\[(.*)\]$", 1) != "",
split(regexp_extract(col("major_options"), r"^\[(.*)\]$", 1), ","),
).otherwise(lit(None)),
)
print("modified schema:")
df.printSchema()
print("modified df:")
df.show(truncate=False)
Выход:
original schema:
root
|-- major_options: string (nullable = true)
original df:
+--------------------------------------------------------------------+
|major_options |
+--------------------------------------------------------------------+
|['Alloy Wheels'] |
|['Light Package', 'Alloy Wheels', 'Bluetooth'] |
|Steering wheel memory |
|Knee airbag |
|['Sunroof/Moonroof', 'Alloy Wheels', 'Bluetooth', 'Parking Sensors']|
|['Alloy Wheels', 'Bluetooth'] |
+--------------------------------------------------------------------+
modified schema:
root
|-- major_options: array (nullable = true)
| |-- element: string (containsNull = false)
modified df:
+-----------------------------------------------------------------------+
|major_options |
+-----------------------------------------------------------------------+
|['Alloy Wheels'] |
|['Light Package', 'Alloy Wheels', 'Bluetooth'] |
|NULL |
|NULL |
|['Sunroof/Moonroof', 'Alloy Wheels', 'Bluetooth', 'Parking Sensors']|
|['Alloy Wheels', 'Bluetooth'] |
+-----------------------------------------------------------------------+
Не могли бы вы поделиться примерами списков и строк из столбца, о котором вы говорите, чтобы нам было легче вам в этом помочь? Пожалуйста, прочтите минимальный воспроизводимый пример.