PySpark: приведение поля NullType в виде строки в столбце struct type

#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")
)