删除数组中的重复项[string]
Remove duplicate in an array[string]
我有一个 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)]
我创建了一个类似
的 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 类型为 String
且 not 类型为 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
。
我有一个 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
。
df.select("v1","v2").groupby("v2").min("v2").show
好的,假设列 if 类型为 String
且 not 类型为 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
。