我的JavaRDD结构如下所示: -
[
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:48:10.108Z],
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:51:12.089Z],
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:52:44.285Z],
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:54:23.250Z],
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:55:35.045Z],
ObjectHandler [username=Hello, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T10:40:07.929Z],
ObjectHandler [username=Hello, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T10:40:54.602Z],
ObjectHandler [username=neelam, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-03T07:16:23.085Z]
]
现在我想在用户名上使用不同的元素,如下所示: -
[
ObjectHandler [username=KAJAL, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T06:48:10.108Z],
ObjectHandler [username=Hello, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-02T10:40:54.602Z],
ObjectHandler [username=neelam, properties={}, event_name=INSTALL, pname=null, ptype=null, pvalue=null, date=2016-08-03T07:16:23.085Z]
]
我使用了JavaRDD.distinct()
函数,但结果相同。
请帮忙。
答案 0 :(得分:1)
JavaRDD.distinct()
会调用ObjectHandler.equals
来检查清晰度 - 如果您没有覆盖它,则每个ObjectHandler
都会被视为不同,因此您最终会相同的RDD。
因此,您有两种选择:
覆盖equals
和hashCode
,仅比较username
:这很简单,然后distinct
会返回预期结果。缺点是 - 您可能希望将ObjectHandler
的两个实例视为不同,即使它们在某些其他情况下具有相同的username
。换句话说,程序中的其他用例需要更严格的这些对象相等。如果是这种情况,您可以使用第二种方法:
减少username
:将username
提取到RDD"密钥",在& #34;随机"选择一个匹配值,然后摆脱这些键。使用Java 8,这看起来像:
final JavaRDD<ObjectHandler> result = rdd
.keyBy(v -> v.username)
.reduceByKey((ObjectHandler v1, ObjectHandler v2) -> v1)
.values();
使用Java 7,这看起来有点乱,但逻辑是相同的:
final JavaRDD<ObjectHandler> result = rdd.keyBy(new Function<ObjectHandler, String>() {
@Override
public String call(ObjectHandler v1) throws Exception {
return v1.username;
}
}).reduceByKey(new Function2<ObjectHandler, ObjectHandler, ObjectHandler>() {
@Override
public ObjectHandler call(ObjectHandler v1, ObjectHandler v2) throws Exception {
return v1; // choosing one "randomly"
}
}).values();