我有一个dataframe
列array
string
如下所示。 (键,值)对
ColA
[(1,2),(1,3),(1,4),(2,3)]
我必须删除最小值的重复键并获得结果。 不想爆炸并做到这一点。键应该是唯一的,并且根据最小值选择键。在上面的列中,有三对密钥为1.因此,选择(1,2)因为值2是(1,2),(1,3),(1,4)中的最小值
输出应该是: 可乐 [(1,2),(2,3)]
我创建了一个类似
的udfVal removeDup = udf((arr: Seq[String]) => {
Arr.map(x=>x.split(","))}))
无法使用reduceby
密钥作为dataframe
/ dataset
。
答案 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