Я смотрел на этот превосходный вопрос, чтобы улучшить свои навыки в Scala и ответить на него: Извлечь значение столбца и назначить его другому столбцу в виде массива в фрейме данных spark
Я создал свой модифицированный код следующим образом, который работает, но у меня осталось несколько вопросов:
import spark.implicits._
import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq(
("r1", 1, 1),
("r2", 6, 4),
("r3", 4, 1),
("r4", 1, 2)
)).toDF("ID", "a", "b")
val uniqueVal = df.select("b").distinct().map(x => x.getAs[Int](0)).collect.toList
def myfun: Int => List[Int] = _ => uniqueVal
def myfun_udf = udf(myfun)
df.withColumn("X", myfun_udf( col("b") )).show
+---+---+---+---------+
| ID| a| b| X|
+---+---+---+---------+
| r1| 1| 1|[1, 4, 2]|
| r2| 6| 4|[1, 4, 2]|
| r3| 4| 1|[1, 4, 2]|
| r4| 1| 2|[1, 4, 2]|
+---+---+---+---------+
Работает, но:
- Я отмечаю, что столбец b вставляется дважды.
- Я также могу поставить в столбце a второе утверждение, и я получаю тот же результат. Например. и какой смысл это тогда?
df.withColumn ("X", myfun_udf (col ("a"))). Show
- Если я введу идентификатор столбца, он будет нулевым.
- Итак, мне интересно, почему вводится второй столбец?
- И как это можно сделать для общей работы для всех столбцов?
Итак, это был код, который я посмотрел в другом месте, но я что-то упустил.