#apache-spark #pyspark #aws-glue
#apache-spark #pyspark #aws-glue
Вопрос:
У меня есть фрейм данных, который имеет следующую схему. translation_version
Поле под translations --> languages (no, pt,...)
столбцом находится в null
. Я хочу привести все translation_version
в виде строки. У меня есть 17 языков под translations
root
|-- translations: struct (nullable = true)
| |-- no: struct (nullable = true)
| | |-- Description: string (nullable = true)
| | |-- class: string (nullable = true)
| | |-- description: string (nullable = true)
| | |-- translation_version: null (nullable = true) // Want to cast as string
| |-- pt: struct (nullable = true)
| | |-- Description: string (nullable = true)
| | |-- class: string (nullable = true)
| | |-- description: string (nullable = true)
| | |-- translation_version: null (nullable = true)
| |-- fr: struct (nullable = true)
| | |-- Description: string (nullable = true)
| | |-- class: string (nullable = true)
| | |-- description: string (nullable = true)
| | |-- translation_version: null (nullable = true)
Я пытался df = df.na.fill('null')
, но ничего не изменил. Также пытался выполнить приведение со следующим кодом
df = df.withColumn("translations", F.col("translations").cast("struct<struct<translation_version: string>>"))
но это вернуло следующую ошибку
pyspark.sql.utils.ParseException: u"nmismatched input '<' expecting ':'(line 1, pos 13)nn== SQL ==nstruct<struct<translation_version: string>>n-------------^^^n"
Есть идеи, как привести все translation_version
в виде строки для каждого языка?
Ответ №1:
это должно сработать
from pyspark.sql.functions import col, struct
from pyspark.sql.types import StructType, StructField, StringType
schema_ = StructType([StructField("Description",StringType(),True),
StructField("class",StringType(),True),
StructField("description",StringType(),True),
StructField("translation_version",StringType(),True)
]
)
df_1 = (
df
.select("translations.*")
.withColumn("translations", struct(
col("fr").cast(schema).alias("fr"),
col("pt").cast(schema).alias("pt"),
col("no").cast(schema).alias("no")
)
)
.drop("fr", "pt", "no")
)