如何根据 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.

因此您有两个选择:

  1. 覆盖equalshashCode,只比较username:这个简单,然后distinct 会 return 预期的结果。缺点是 - 您可能希望 ObjectHandler 的两个实例被视为 不同 ,即使它们在某些其他情况下具有相同的 username。换句话说,您程序中的其他用例将要求这些对象更严格地相等。如果是这种情况,您可以使用第二种方法:

  2. 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();