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

时间:2017-07-25 03:49:20

标签: scala apache-spark apache-spark-sql user-defined-functions

我有一个dataframearray string如下所示。 (键,值)对

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

2 个答案:

答案 0 :(得分:1)

好的,所以如果String类型的列和类型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

答案 1 :(得分:0)

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