Замените значение одного столбца из другого столбца в кадре данных искры
У меня есть датафрейм, как показано ниже
+---+------------+----------------------------------------------------------------------+
|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|
+---+-------+--------------+
Надеюсь это поможет!