Соберите значение столбца фрейма данных Spark для установки - PullRequest
0 голосов
/ 14 июля 2020

У меня есть обстоятельства, когда мне нужно собирать значения столбцов как Set () в искровом фрейме данных, чтобы найти разницу с другим набором. У меня есть следующие 2 кадра данных

DF1
+----+---------+----------+----+-----------------+
|Lily|Sunflower|Windflower|Rose|Snapdragon Flower|
+----+---------+----------+----+-----------------+
|1   |2        |3         |4   |5                |
+----+---------+----------+----+-----------------+

DF2
+-----------------+
|Flowers          |
+-----------------+
|Rose             |
|Lily             |
|Tulip            |
|Orchid           |
|Snapdragon Flower|
+-----------------+

Я хочу найти установленную разницу между именами столбцов DF1 и значениями столбца Flower из DF2. Для этого я написал следующий код, но создаю пустое значение в их установленной разнице. КОД:

import sparkSession.sqlContext.implicits._
val df1 = Seq(("1", "2", "3", "4", "5")).toDF("Lily", "Sunflower", "Windflower", "Rose", "Snapdragon Flower")
val df2 = Seq("Rose", "Lily", "Tulip", "Orchid", "Snapdragon Flower").toDF("Flowers")

val set1 = df1.columns.toSet
println(s"set1 => ${set1}")

val flower_values = df2.select("Flowers").collectAsList()
var set2 = Set("") //introduce empty String Type column
for (i <- 0 until flower_values.size()) {
  var col = flower_values.get(i).toString()
  set2 += col.substring(1, col.size - 1)
}
println(s"set2 => ${set2}")

val dif_btw_set2_and_set1 = set2.diff(set1)
println(s"dif_btw_set2_and_set1 => ${dif_btw_set2_and_set1}")

ВЫХОД:

set1 => Set(Sunflower, Rose, Windflower, Snapdragon Flower, Lily)
set2 => Set(, Orchid, Rose, Snapdragon Flower, Tulip, Lily)
dif_btw_set2_and_set1 => Set(, Orchid, Tulip)

Можно ли сделать это более элегантно в Scala -Spark?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Надеюсь, это поможет, он дает вам значения столбца в Set

val set2 = df2.select("Flowers").as[String].collect().toSet
0 голосов
/ 14 июля 2020

Это даст вам второй фрейм данных в виде набора строк:

val flower_values = df2.select("Flowers").collectAsList()
val set2 = flower_values.map(_.getString(0)).toSet

collectAsList даст вам List [Row]. Чтобы взять строковое значение из первого столбца строки, вам нужно getString(0). Чтобы преобразовать List [Row] в Set [String], вы можете использовать map для перемещения по списку и toSet для окончательного преобразования в набор.

Примечание: Set("") создает набор с одним элементом (пустая строка). Set() создает пустой набор. Но создание такого набора даже не обязательно для этого примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...