Сбой сбора RDD ()

Вопрос, который, как мне кажется, может принести пользу другим.

Если я побегу

val rdd1  = sc.parallelize( List( "a", "b", "c", "d", "e")) 
val rdd1a = rdd1.map(x => (x, 110, 110 - x.toByte ))

rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[55] at parallelize at <console>:44
rdd1a: org.apache.spark.rdd.RDD[(String, Int, Int)] = MapPartitionsRDD[56] at map at <console>:46

оно работает.

Как только я добавлю собирать

val rdd1  = sc.parallelize( List( "a", "b", "c", "d", "e")) 
val rdd1a = rdd1.map(x => (x, 110, 110 - x.toByte )).collect()

это терпит неудачу.

Логика действительно ускользает от меня. Кто может уточнить? Это RDD так?


person thebluephantom    schedule 09.08.2017    source источник
comment
Это потому, что карта — это ленивое преобразование, которое не вызывается до тех пор, пока не будет вызвано действие (собрать). Ваш первый пример не терпит неудачу, потому что карта еще не вызвана   -  person Fabich    schedule 09.08.2017
comment
понял что, а первопричина есть?   -  person thebluephantom    schedule 09.08.2017


Ответы (1)


Ошибка здесь

val rdd1a = rdd1.map(x => (x, 110, 110 - x.toByte ))

Так как x это string и вы пытаетесь изменить его на Byte

что вы должны сделать, это

val rdd1a = rdd1.map(x => (x, 110, 110 - x.toCharArray()(0).toByte ))

Здесь не получилось

val rdd1a = rdd1.map(x => (x, 110, 110 - x.toByte ))

поскольку это ленивая оценка, она не выполняется, collect — это действие. После выполнения действия код также выполняется.

Надеюсь это поможет

person koiralo    schedule 09.08.2017
comment
Итак, что это делает? - person thebluephantom; 09.08.2017
comment
x.toCharArray()(0), то есть. - person thebluephantom; 09.08.2017
comment
Если вы пытаетесь использовать код ASCII, он преобразуется в Char и преобразуется в Byte. - person koiralo; 09.08.2017