#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.
Поэтому у вас есть два варианта:
-
Переопределить
equals
иhashCode
, только сравнитьusername
: это просто сделать, а затемdistinct
вернет ожидаемый результат. Недостатком является то, что вы можете захотеть, чтобы два экземпляраObjectHandler
считались разными, даже если они одинаковыusername
при некоторых других обстоятельствах. Другими словами, другие варианты использования в вашей программе потребовали бы более строгого равенства этих объектов. Если это так, вы можете использовать второй подход: -
Уменьшить на
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 — Спасибо 🙂