【问题标题】:Remove duplicate in an array[string]删除数组中的重复项[字符串]
【发布时间】:2017-12-30 19:22:02
【问题描述】:

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

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

我必须按最小值删除重复键并获得结果。 不想爆炸就去做。密钥应该是唯一的,并且根据最小值选择密钥。在上列中,有三对 key 为 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。

【问题讨论】:

  • 你能清楚地说明输入数据框列吗?
  • 数据框中只有一列
  • 如果取最小值,如何得到 ColA (1,2),(2,3)?
  • 编辑了更多解释
  • @Deek 您可以为您拥有的数据框提供示例输入数据吗?

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


【解决方案1】:

好的,只要列 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。

【讨论】:

    【解决方案2】:
    df.select("v1","v2").groupby("v2").min("v2").show­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
    

    【讨论】:

    • 它是一个带有字符串数组的单列。这可能没有帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多