как получить доступ к значениям из столбца массива в scala dataframe - PullRequest
0 голосов
/ 13 марта 2020

У меня есть датафрейм с scala массивом кортежей (индекс, значение), как показано ниже, индекс имеет значения от 1 до 4

id  | units_flag_tuples

id1 | [(3,2.0), (4,6.0)]

id2 | [(1,10.0), (2,2.0), (3,5.0)]

Я хотел бы получить доступ к значению из массива и поместите его в столбцы на основе индекса (unit1, unit2, unit3, unit4):

ID | unit1| unit2 | unit3 | unit 4

id1 | null | null  | 2.0   | 6.0

id2 | 10.0 | 2.0   | 5.0   | null

вот код:

df
.withColumn("unit1", col("units_flag_tuples").find(_._1 == '1').get._2  )
.withColumn("unit2", col("units_flag_tuples").find(_._1 == '2').get._2  )
.withColumn("unit3", col("units_flag_tuples").find(_._1 == '3').get._2  )
.withColumn("unit4", col("units_flag_tuples").find(_._1 == '4').get._2  )

Вот сообщение об ошибке, которое я получаю:

ошибка: поиск значения не является членом org. apache .spark. sql .Column

Как устранить эту ошибку или как лучше сделай это?

1 Ответ

0 голосов
/ 13 марта 2020

Вот мой другой подход: я использовал функцию map_from_entries, чтобы создать карту для массива и получить каждый столбец, выбрав ключ на карте.

val df = Seq(("id1", Seq((3,2.0), (4,6.0))), ("id2", Seq((1,10.0), (2,2.0), (3,5.0)))).toDF("id", "units_flag_tuples")
df.show(false)

df.withColumn("map", map_from_entries(col("units_flag_tuples")))
  .withColumn("unit1", col("map.1"))
  .withColumn("unit2", col("map.2"))
  .withColumn("unit3", col("map.3"))
  .withColumn("unit4", col("map.4"))
  .drop("map", "units_flag_tuples").show

Результат:

+---+-----+-----+-----+-----+
| id|unit1|unit2|unit3|unit4|
+---+-----+-----+-----+-----+
|id1| null| null|  2.0|  6.0|
|id2| 10.0|  2.0|  5.0| null|
+---+-----+-----+-----+-----+
...