2016-08-12 3 views
1

Я ищу эквивалент Pyspark для этого вопроса: How to get the number of elements in partition?.Подсчитайте количество элементов в каждом pyspark разделе RDD

В частности, я хочу программно подсчитать количество элементов в каждом разделе RysDys или dataframe pyspark (я знаю, что эта информация доступна в пользовательском интерфейсе Spark Web).

Эта попытка приводит к «AttributeError: объект„NoneType“не имеет атрибута" _jvm»:

df.foreachPartition(lambda iter: sum(1 for _ in iter))

Я не хочу, чтобы собрать содержимое итератора в память.

ответ

4

Если вы спрашиваете: можем ли мы получить количество элементов в итераторе без итерации через него? Ответ No.

Но мы не должны хранить его в памяти, как в посте вы упомянули:

def count_in_a_partition(idx, iterator): 
    count = 0 
    for _ in iterator: 
    count += 1 
    return idx, count 

data = sc.parallelize([ 
    1, 2, 3, 4 
], 4) 

data.mapPartitionsWithIndex(count_in_a_partition).collect() 

EDIT

Обратите внимание, что ваш код очень близок к решению, только что mapPartitions необходимо вернуть итератор:

def count_in_a_partition(iterator): 
    yield sum(1 for _ in iterator) 

data.mapPartitions(count_in_a_partition).collect() 
+0

Спасибо @ShuaiYuan. Нет, я знаю, что мне придется перебирать счет, чтобы получить счет. Ваше первое решение работает для меня! Тем не менее, второй по-прежнему бросает тот же атрибут AttributeError, что и моя первоначальная попытка в Spark 1.5.0 (кластер моей организации) даже на «данные» rdd, которые вы создаете в своем примере. AttributeError: объект «NoneType» не имеет атрибута «_jvm». Однако в Spark Community Edition с версиями 1.6.0 или 1.5.2 оба ваших решения работают. Возможно, что-то странное в моем местном дистрибутиве CDH? –

+0

Может быть. К сожалению, у меня нет Spark 1.5.0 для тестирования. – ShuaiYuan

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