2016-07-05 2 views
0

Я хотел бы определить аккумулятор в pyspark, который имеет тип List и накапливает строковые значения для рабочих узлов. Вот код, у меня есть:пользовательский класс аккумулятора в искры

class ListParam(AccumulatorParam): 
def zero(self, v): 
    return [] 
def addInPlace(self, acc1, acc2): 
    acc1.extend(acc2) 
    return acc1 

Я тогда определить аккумулятор такого типа, как показано ниже

accu = sc.accumulator([], ListParam()) 

, а затем добавить различные значения к нему в исполнителях следующим

accu.add("abc") 

Я хотел бы, чтобы значение abc отображалось как одно значение в аккумуляторе, но накопитель добавляет три разных значения (один символ pr), и когда я смотрю на accu Значение в драйвере выглядит как ['a','b','c']. Как я могу изменить его так, чтобы он не добавлял каждый символ в отдельную запись в накопителе?

-------------- редактировать ----------------

я определил другой пользовательский класс для моего аккумулятора следующим

class VectorAccumulatorParam(AccumulatorParam): 
def zero(self, value): 
    return [0.0] * len(value) 
def addInPlace(self, val1, val2): 
    for i in range(len(val1)): 
     val1[i] += val2[i] 
    return val1  

и в работника у меня есть следующий код

global accu 
accu += [accuracy] 

, но когда я напечатать accu в драйвере, он пуст. Ничего плохого?

+0

Как использовать? –

ответ

0

Вы пытались явно сказать искру, чтобы выполнять свои операции, связанные с аккумулятором? Как вы должны знать, spark's operations are lazy, и много раз вам нужно позвонить rdd.collect(), чтобы фактически выполнить ваши сопоставления

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