如何根据JavaRDD <objecthandler>对象中的特定列查找不同的元素?

时间:2016-10-04 09:27:45

标签: java apache-spark rdd distinct-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()函数,但结果相同。 请帮忙。

1 个答案:

答案 0 :(得分:1)

JavaRDD.distinct()会调用ObjectHandler.equals来检查清晰度 - 如果您没有覆盖它,则每个ObjectHandler都会被视为不同,因此您最终会相同的RDD。

因此,您有两种选择:

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

  2. 减少username :将username提取到RDD&#34;密钥&#34;,在& #34;随机&#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();