2015-06-03 1 views
1

Предположим, у меня есть PairRDD, студенты (id, имя). Я хотел бы сохранить только строки, где id находится в другом RDD, activeStudents (id).Как удалить строки RDD, чей ключ не находится в другом RDD?

Решение, которое у меня есть, - это создать PairDD из activeStudents, (id, id) и присоединиться к учащимся.

Есть ли более элегантный способ сделать это?

ответ

2

Это очень хорошее решение для начала. Если активные ученики достаточно малы, вы можете собирать идентификаторы в виде карты, а затем фильтровать с присутствием идентификатора (это позволяет избежать необходимости перетасовать).

0

Как и вы, вы можете сделать внешнее соединение, если оба RDD содержат ключи и значения.

val students: RDD[(Long, String)] 
val activeStudents: RDD[Long] 
val activeMap: RDD[(Long, Unit)] = activeStudents.map(_ ->()) 
val activeWithName: RDD[(Long, String)] = 
    students.leftOuterJoin(activeMap).flatMapValues { 
    case (name, Some(())) => Some(name) 
    case (name, None) => None 
    } 
0

Если вам не нужно вступать в эти два набора данных, вам обязательно следует избегать этого. В последнее время у меня была аналогичная проблема, и я успешно ее разрешил, используя широковещательный набор, который я использовал в UDF, чтобы проверить, находится ли каждая строка RDD (скорее значение из одного из ее столбцов) в этом наборе. Этот UDF используется в качестве основы для преобразования фильтра.

Подробнее здесь: whats-the-most-efficient-way-to-filter-a-dataframe.

Надеюсь, это поможет. Спросите, не ясно ли это.

Смежные вопросы