Здесь другой подход, который извлечет нужный индекс массива из card type
и затем назначит его в новый столбец.Мы можем добиться этого, используя функции Spark array
и array_position
, представленные в Spark 2.4:
import org.apache.spark.sql.functions.{array_position, array, udf, lit}
val cardTypes = Seq("Distinguish", "Vista", "ColonialVoice", "SuperiorCard")
val df = Seq(
("ColonialVoice"),
("SuperiorCard"),
("Vista"),
("Distinguish"))
.toDF("card_type")
df.withColumn("card_indx",
array_position(array(cardTypes.map(t => lit(t)):_*), $"card_type"))
.orderBy("card_indx")
.drop("card_indx")
.show
Сначала мы создаем массив из содержимого cardType Seq с помощью array(cardTypes.map(t => lit(t)):_*)
, затем извлекаем и присваиваем индекстекущий card_type в новый столбец card_indx.Наконец, мы упорядочиваем по card_indx.
Вывод:
+-------------+
| card_type|
+-------------+
| Distinguish|
| Vista|
|ColonialVoice|
| SuperiorCard|
+-------------+
Для Spark <2.4.0 массив_положение недоступно, и вы можете использовать udf: </p>
val getTypesIndx = udf((types: Seq[String], cardt: String) => cardTypes.indexOf(cardt))
df.withColumn("card_indx", getTypesIndx(array(cardTypes.map(t => lit(t)):_*), $"card_type"))
.orderBy("card_indx")
.drop("card_indx")
.show