gpt4 book ai didi

java - 如何根据 JavaRDD 对象中的特定列查找不同元素?

转载 作者:行者123 更新时间:2023-12-01 09:25:45 27 4
gpt4 key购买 nike

我的 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 将返回预期的结果。缺点是 - 您可能希望 ObjectHandler 的两个实例被视为不同,即使它们在某些其他情况下具有相同的用户名。换句话说,程序中的其他用例将要求这些对象具有更严格的相等性。如果是这种情况,您可以使用第二种方法:

  2. Reduce by username:将username提取到RDD的“key”中,在“随机”选择的同时按该key进行reduce匹配值之一,然后删除这些键。对于 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();

关于java - 如何根据 JavaRDD<ObjectHandler> 对象中的特定列查找不同元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com