Как найти отдельный элемент на основе определенного столбца из JavaRDD объект?

#java #apache-spark #rdd #distinct-values

#java #apache-spark #rdd #distinct-значения

Вопрос:

Моя структура 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:

JavaRDD.distinct() будет вызываться ObjectHandler.equals для проверки на четкость — если вы не переопределили его, каждый ObjectHandler будет считаться другим, и, таким образом, вы получите один и тот же RDD.

Поэтому у вас есть два варианта:

  1. Переопределить equals и hashCode , только сравнить username : это просто сделать, а затем distinct вернет ожидаемый результат. Недостатком является то, что вы можете захотеть, чтобы два экземпляра ObjectHandler считались разными, даже если они одинаковы username при некоторых других обстоятельствах. Другими словами, другие варианты использования в вашей программе потребовали бы более строгого равенства этих объектов. Если это так, вы можете использовать второй подход:

  2. Уменьшить на username : извлечь username в «ключ» RDD, уменьшить на этот ключ, «случайным образом» выбирая одно из соответствующих значений, а затем избавиться от этих ключей. С 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();
      

Комментарии:

1. @ Tzach Zohar — Спасибо 🙂