Замените значение одного столбца из другого столбца в кадре данных искры

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

+---+------------+----------------------------------------------------------------------+
|id |indexes     |arrayString                                                           |
+---+------------+----------------------------------------------------------------------+
|2  |1,3         |[WrappedArray(3, Str3), WrappedArray(1, Str1)]                        |
|1  |2,4,3       |[WrappedArray(2, Str2), WrappedArray(3, Str3), WrappedArray(4, Str4)] |
|0  |1,2,3       |[WrappedArray(1, Str1), WrappedArray(2, Str2), WrappedArray(3, Str3)] |
+---+------------+----------------------------------------------------------------------+

я хочу перебрать arrayString и получить первый элемент в качестве индекса и второй элемент в виде String. Затем замените индексы на String, соответствующие индексу в arrayString. Я хочу вывод, как показано ниже.

+---+---------------+
|id |replacedString |
+---+---------------+
|2  |Str1,Str3      |
|1  |Str2,Str4,Str3 |
|0  |Str1,Str2,Str3 |
+---+---------------+

Я попытался с помощью функции UDF ниже.

  val replaceIndex = udf((itemIndex: String, arrayString: Seq[Seq[String]]) => {
      val itemIndexArray = itemIndex.split("\\,")
    arrayString.map(i => {
      itemIndexArray.updated(i(0).toInt,i(1))
    })
    itemIndexArray
  })

Это дает мне ошибку, и я не получаю желаемый результат. Есть ли другой способ добиться этого. Я не могу использовать explode и join, так как я хочу, чтобы индексы были заменены на строку без потери порядка.

,

1 ответ

Решение

Вы можете создать udf как показано ниже, чтобы получить требуемый результат, конвертировать в массив array в map и найти индекс в качестве ключа в map,

val replaceIndex = udf((itemIndex: String, arrayString: Seq[Seq[String]]) => {
  val indexList = itemIndex.split("\\,")
  val array = arrayString.map(x => (x(0) -> x(1))).toMap
  indexList map array mkString ","
})

dataframe.withColumn("arrayString", replaceIndex($"indexes", $"arrayString"))
.show( false)

Выход:

+---+-------+--------------+
|id |indexes|arrayString   |
+---+-------+--------------+
|2  |1,3    |Str1,Str3     |
|1  |2,4,3  |Str2,Str4,Str3|
|0  |1,2,3  |Str1,Str2,Str3|
+---+-------+--------------+

Надеюсь это поможет!

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