Как добавить новое поле во вложенный массив столбца структуры в spark <= 2.3

У меня есть фрейм данных со схемой, как показано ниже

root
     |-- date: timestamp (nullable = true)
     |-- questionAnswerList: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- questionNumber: string (nullable = true)
     |    |    |-- listAnswers: array (nullable = true) 
     |    |    |    |-- element: string(containsNull = true)


И я хочу добавить новое поле внутри массива структуры, как показано ниже.

root
     |-- date: timestamp (nullable = true)
     |-- questionAnswerList: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- index: integer (nullable = true)
     |    |    |-- questionNumber: string (nullable = true)
     |    |    |-- listAnswers: array (nullable = true) 
     |    |    |    |-- element: string(containsNull = true)

Я попытался использовать UDF, как показано ниже.

val  addIndexInStruct: UserDefinedFunction = udf((data: Seq[Row]) => {
    data.zipWithIndex.map{case (Row(x:String,y:Array[String]), index) => (index, x, y )}
  })

df.withColumn("newCol",addIndexInStruct($"questionAnswerList")).show(false)

Но у меня следующая ошибка:

Caused by: scala.MatchError: ([Q10,WrappedArray(R10.1, R10.2)],0) (of class scala.Tuple2)

Кто-нибудь знает, как это сделать в spark 2.X? В других сообщениях я видел, что в spark 3.X можно использовать функцию преобразования.

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я наконец решил это. Seq нужно было использовать вместо Array в части сопоставления с образцом.

val  addIndexInStruct: UserDefinedFunction = udf((data: Seq[Row]) => {
    data.zipWithIndex.map{case (Row(x: String,y: Seq[String]), index) => (index, x, y )}
  })

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