2015-02-24 1 views
9

Есть ли способ получить количество элементов в искровом RDD-разделе, учитывая идентификатор раздела? Без сканирования всего раздела.Как получить количество элементов в разделе?

Что-то вроде этого:

Rdd.partitions().get(index).size() 

Только я не вижу такой API для искры. Есть идеи? обходные пути?

Благодаря

ответ

15

Следующая дает вам новый RDD с элементами, размеры каждого раздела:

rdd.mapPartitions(iter => Array(iter.size).iterator, true) 
+1

Спасибо! Из того, что я понимаю, 'iter.size' выполняет итерацию через весь раздел, чтобы получить его размер (исправьте меня, если я ошибаюсь здесь). Есть ли способ получить размер раздела без повторения через него? – Geo

+1

Я так не думаю. – pzecevic

+1

Правильно. Невозможно узнать размер до тех пор, пока итерация не будет запрошена напрямую, поскольку она более эффективна по памяти, когда данные извлекаются по требованию не все сразу (что не может вписаться в доступную память). –

7

PySpark:

num_partitions = 20000 
a = sc.parallelize(range(int(1e6)), num_partitions) 
l = a.glom().map(len).collect() # get length of each partition 
print(min(l), max(l), sum(l)/len(l), len(l)) # check if skewed 

Спарк/Scala:

val numPartitions = 20000 
val a = sc.parallelize(0 until 1e6.toInt, numPartitions) 
val l = a.glom().map(_.length).collect() # get length of each partition 
print(l.min, l.max, l.sum/l.length, l.length) # check if skewed 

Кредиты: Mike Dusenberry @https://issues.apache.org/jira/browse/SPARK-17817

То же самое можно сделать для фрейма данных, а не только для RDD. Просто добавьте DF.rdd.glom ... в код выше.