Spark: индекс значения в массиве внутри ColumnType

В Spark, используя Scala, у меня есть набор данных со столбцом, имеющим массив, как

[foo, bar, baz, bei]
[foo, bar, baz, bei]
[foo, zie]

Теперь я хочу добавить еще один столбец с индексом значения "бар"

[foo, bar, baz, bei]     2  
[foo, zie]  0 

Есть ли что-то похожее на

.withColumn("idx", array_contains(col("Name"),"bar"))

который возвращает мне истину / ложь (мне нужен индекс значения)?

2 ответа

Решение

С UDF:

val df = List(
  Seq("foo", "bar", "baz", "bei"),
  Seq("foo", "bar", "baz", "bei"),
  Seq("foo", "zie")
).toDF()

val getIndex = (seq: Seq[String]) => seq.indexOf("bar") + 1
val getIndexUDF = udf(getIndex)

val result = df.withColumn("idx", getIndexUDF($"value"))
result.show(false)

Выход:

+--------------------+---+
|value               |idx|
+--------------------+---+
|[foo, bar, baz, bei]|2  |
|[foo, bar, baz, bei]|2  |
|[foo, zie]          |0  |
+--------------------+---+

Начиная с версии 2.4.0 Spark предоставляет array_position функция

import org.apache.spark.sql.functions.array_position

df.withColumn("idx", array_position($"Name", "bar"))
Другие вопросы по тегам