收集要设置的spark dataframe列值

mwg9r5ms  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(325)

在某些情况下,我需要在spark dataframe中将列值收集为set(),以找出与其他集合的差异。我有以下两个Dataframe

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

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

我想找出df1的列名和df2的flower列的值之间的差异。为此,我编写了以下代码,但在它们的集合差异中创建空值。代码:

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中是否可以以更优雅的方式实现这一点?

ftf50wuq

ftf50wuq1#

我希望这会有所帮助,它会在集合中为您提供列的值

val set2 = df2.select("Flowers").as[String].collect().toSet
qco9c6ql

qco9c6ql2#

这将为您提供第二个Dataframe作为字符串集:

val flower_values = df2.select("Flowers").collectAsList()
val set2 = flower_values.map(_.getString(0)).toSet
``` `collectAsList` 我会给你一张单子。从需要的行的第一列获取字符串值 `getString(0)` . 要将list[row]转换为set[string],可以使用 `map` 遍历列表 `toSet` 最后转换成一个集合。
注: `Set("")` 创建一个包含一个元素(空字符串)的集。 `Set()` 创建一个空集。但是在这个例子中,创建这样的集合甚至不是必需的。

相关问题