2015-10-07 3 views
3

Я использую искровой поток для чтения данных из кластера kafka. Я хочу отсортировать пару DStream и получить Top N в одиночку. До сих пор я сортируется с помощьюSpark DStream сортировать и принимать N элементов

val result = ds.reduceByKeyAndWindow((x: Double, y: Double) => x + y, 
        Seconds(windowInterval), Seconds(batchInterval)) 
result.transform(rdd => rdd.sortBy(_._2, false)) 
result.print 

Мои вопросы

  • Как получить только первые N элементов из dstream?
  • Операция преобразования применяется rdd по rdd. Так будет ли результат сортироваться по всем элементам во всех rdds? Если не так, как это сделать?
+1

Вы смогли это решить? –

+0

, так как reduceByKeyAndWindow приводит к одиночному rdd. Rdd.sortBy(). Take (N) будет работать. – Knight71

+1

result.transform (rdd => rdd.sortBy (_._ 2, false)), я думаю, что добавление во внутрь метода преобразования дает ошибку, говорящее: найдено: Array, required: rdd [?]. Не могли бы вы рассказать, как и решили? – Alok

ответ

2

Вы можете использовать метод преобразования в объекте DStream, затем отсортировать входной RDD и взять n его элементов в списке, а затем отфильтровать исходный RDD, который будет содержаться в этом списке.

Примечание: Оба RDD и DStream неизменяемы, поэтому любое преобразование вернет новый RDD или DStream, но не изменится в исходном RDD или DStream.

val n = 10 
val topN = result.transform(rdd =>{ 
    val list = rdd.sortBy(_._2, false).take(n) 
    rdd.filter(list.contains) 
}) 
topN.print 
Смежные вопросы