如何根据 JavaRDD<ObjectHandler> 对象的特定列查找不同的元素?
How to find distinct element on the basis of a particular column from JavaRDD<ObjectHandler> object?
我的 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()
函数,但结果是一样的。
请帮忙
JavaRDD.distinct()
会调用 ObjectHandler.equals
来检查区别性——如果你没有覆盖它,每个 ObjectHandler
都会被认为是不同的,因此你最终会得到相同的结果RDD.
因此您有两个选择:
覆盖equals
和hashCode
,只比较username
:这个简单,然后distinct
会 return 预期的结果。缺点是 - 您可能希望 ObjectHandler
的两个实例被视为 不同 ,即使它们在某些其他情况下具有相同的 username
。换句话说,您程序中的其他用例将要求这些对象更严格地相等。如果是这种情况,您可以使用第二种方法:
Reduce by username
:将username
提取到RDD的"key"中,按那个键减少,而"randomly" 选择其中一个匹配值,然后去掉这些键值。使用 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();
我的 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()
函数,但结果是一样的。
请帮忙
JavaRDD.distinct()
会调用 ObjectHandler.equals
来检查区别性——如果你没有覆盖它,每个 ObjectHandler
都会被认为是不同的,因此你最终会得到相同的结果RDD.
因此您有两个选择:
覆盖
equals
和hashCode
,只比较username
:这个简单,然后distinct
会 return 预期的结果。缺点是 - 您可能希望ObjectHandler
的两个实例被视为 不同 ,即使它们在某些其他情况下具有相同的username
。换句话说,您程序中的其他用例将要求这些对象更严格地相等。如果是这种情况,您可以使用第二种方法:Reduce by
username
:将username
提取到RDD的"key"中,按那个键减少,而"randomly" 选择其中一个匹配值,然后去掉这些键值。使用 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();