删除数组中的重复项[string]

Remove duplicate in an array[string]

我有一个 dataframe 列,其中 arraystring,如下所示。 (键,值)对

ColA
[(1,2),(1,3),(1,4),(2,3)]

我必须按最小值删除重复的键并得到结果。 不想爆炸就去做。密钥应该是唯一的,并且根据最小值选择密钥。在上面的列中,有三对键为1。因此应该选择(1,2),因为值2是(1,2),(1,3),(1,4)

中的最小值

输出应该是: 可乐 [(1,2),(2,3)]

我创建了一个类似

的 udf
Val removeDup = udf((arr: Seq[String]) => {
Arr.map(x=>x.split(","))}))

不能将 reduceby 键用作 dataframe/dataset

df.select("v1","v2").groupby("v2").min("v2").show­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

好的,假设列 if 类型为 Stringnot 类型为 Seq[String],下面的代码应该可以满足您的需求:

val removeDup = udf((str: String) => {
  str.split("\(|\)").filter(s => s != "," && s != "").map(s => {
    val array = s.replace("(", "").replace(")", "").split(",")
    (array(0), array(1))
  })
  .groupBy(_._1)
  .mapValues(a => a.sortBy(_._2).head)
  .values
  .toSeq
  .sortBy(_._1)
})

以你的例子为例:

val df = spark.sparkContext.parallelize(Seq("(1,2),(1,3),(1,4),(2,3)").toDF("colA")

df.select(removeDup('colA)).show

这产生

+--------------------+
|           UDF(colA)|
+--------------------+
|      [[1,2], [2,3]]|
+--------------------+

如果您希望将列类型保持为 String,则需要将 .mkString(",") 添加到 udf