2015-06-02 4 views
1

У меня есть базовый RDD [Object], на котором я применяю карту с хеш-функцией на значения Object, используя nextGaussian и nextDouble scala. И когда я печатаю значения, они меняются при каждой печатиMy RDD меняет свои значения

def hashmin(x:Data_Object, w:Double) = { 
    val x1 = x.get_vector.toArray 
    var a1 = Array(0.0).tail 
    val b = Random.nextDouble * w 

    for(ind <- 0 to x1.size-1) { 
     val nG = Random.nextGaussian 
     a1 = a1 :+ nG 
    } 

    var sum = 0.0 

    for(ind <- 0 to x1.size-1) { 
     sum = sum + (x1(ind)*a1(ind)) 
    }   

    val hash_val = (sum+b)/w 

    val hash_val1 = (x.get_id,hash_val) 
    hash_val1 
} 


val w = 8 
val rddhash = parsedData.map(x => hashmin(x,w)) 
rddhash.foreach(println) 
rddhash.foreach(println) 

Я не понимаю, почему. Заранее спасибо.

ответ

3

RDD - это просто «указатель» на операции с данными +, которые должны быть применены к нему. Действия материализуют эти операции, выполняя линию RDD.

Итак, RDD в основном пересчитываются при запросе действия. В этом случае функция отображения карты, вызывающая hashmin, оценивается каждый раз, когда вызывается действие .

Там вы несколько вариантов:

  • Cache ДРР - это приведет к тому, родословная быть сломаны и будут сохранены результаты первого преобразования:

    val rddhash = parsedData.map(x => hashmin(x,w)).cache()

  • Используйте семя для вашей случайной функции, так как генерируемая псевдослучайная последовательность каждый раз одинакова.

+0

Первый вариант не решает проблему, если rdd пересматривается, например, из-за отсутствия достаточной памяти. – abalcerek

+0

@ user52045 вам нужно будет использовать альтернативный метод «persist (...)» и обеспечить уровень хранения. 'MEMORY_AND_DISK_SER'. 'cache' является сокращением для' persist (StorageLevel.MEMORY). Но в целом это должно служить цели. – maasg

+0

Из того, что я понимаю, это минимизирует пересчет, но нет гарантии, что он вообще не будет пересчитан. – abalcerek

0

RDD являются ленивыми - они вычисляются, когда они используются. Поэтому призывы к Random.nextGaussian выполняются каждый раз при вызове foreach.

Вы можете использовать persist() для хранения RDD, если вы хотите сохранить фиксированные значения.

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