删除数组列中的重复项 Spark

我有这个 DataSet :


+-------------------+--------------------+
| date| products|
+-------------------+--------------------+
|2017-08-31 22:00:00|[361, 361, 361, 3...|
|2017-09-22 22:00:00|[361, 362, 362, 3...|
|2017-09-21 22:00:00|[361, 361, 361, 3...|
|2017-09-28 22:00:00|[360, 361, 361, 3...|


在哪里列 products - 这是一系列具有可能被称为元素的行数。

我想删除它重复 /在一行中/

我所做的基本上写了这样的功能 UDF


val removeDuplicates: WrappedArray[String] => WrappedArray[String] = _.distinct
val udfremoveDuplicates = udf/removeDuplicates/


这个决定给了我正确的结果。 :


+-------------------+--------------------+--------------------+
| date| products| rm_duplicates|
+-------------------+--------------------+--------------------+
|2017-08-31 22:00:00|[361, 361, 361, 3...|[361, 362, 363, 3...|
|2017-09-22 22:00:00|[361, 362, 362, 3...|[361, 362, 363, 3...|


我的问题如下 :

提供谎言 Spark 最好/一种更有效的方法来实现这个结果 ?

我想过关于使用该卡 - 但是如何以列表的形式获取所需的列,以便能够使用该方法 'distinct', 如在我的那样

removeDuplicates

lambda ?

Edit: 我标明了这个主题标签 java, 因为对我来说没关系,哪种语言 /scala 或者 java/ 我会得到 answear :/
Edit2: 挖掘
已邀请:

帅驴

赞同来自:

提交给问题的方法 - 使用UDF是最好的方法
spark-sql

它没有内置原始的统一统一。

如果您处理巨大的数据量和/或者阵列的值具有唯一的属性,然后

值得思考的实施 UDF

.


WrappedArray.distinct

建筑
mutable.HashSet

在幕后,然后通过它来构建一个不同元素的数组。 从表现的角度来看,这里有两个问题:

可变的集合 Scala 不是很有效,所以在胆量中 Spark 你会找到很多系列 Java 和循环
while

. 如果您需要极端性能,您可以实现自己的通用 distinct, 使用更快的数据结构。

普遍实施
distinct

不使用数据的任何属性。 例如,如果阵列平均较小,则将其直接构建的简单实现并执行线性搜索对重复项,这可以比构建复杂数据结构的代码更好地工作,尽管其理论复杂性
O/n^2/

. 例如,如果值只能在小拨号中的小范围或字符串中只能是数字,则可以使用位拨号实现统一。

同样,如果您有搞笑数据卷,则应考虑这些策略。 您的简单实现是几乎任何情况的理想选择。

窦买办

赞同来自:

考虑到你的目前
dataframe


schema

作为


root
|-- date: string /nullable = true/
|-- products: array /nullable = true/
| |-- element: integer /containsNull = false/


您可以使用以下方法删除重复项。


df.map/row => DuplicateRemoved/row/0/.toString, row/1/.asInstanceOf[mutable.WrappedArray[Int]], row/1/.asInstanceOf[mutable.WrappedArray[Int]].distinct//.toDF//


当然,为此,您需要
case class



case class DuplicateRemoved/date: String, products: mutable.WrappedArray[Int], rm_duplicates: mutable.WrappedArray[Int]/


你必须得到以下结论。


+-------------------+------------------------------+-------------------------+
|date |products |rm_duplicates |
+-------------------+------------------------------+-------------------------+
|2017-08-31 22:00:00|[361, 361, 361, 362, 363, 364]|[361, 362, 363, 364] |
|2017-09-22 22:00:00|[361, 362, 362, 362, 363, 364]|[361, 362, 363, 364] |
|2017-09-21 22:00:00|[361, 361, 361, 362, 363, 364]|[361, 362, 363, 364] |
|2017-09-28 22:00:00|[360, 361, 361, 362, 363, 364]|[360, 361, 362, 363, 364]|
+-------------------+------------------------------+-------------------------+


我希望答案是有用的

要回复问题请先登录注册