2017-08-09 36 views
0

我觉得这个问题可能会使其他人受益。RDD collect()失败

如果我运行

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吗?

+0

这是因为,“地图”是一个懒惰的转变是不叫,直到动作被称为(“收集”)。你的第一个例子不会失败,因为地图尚未调用 – Fabich

+0

了解,但根本原因是? – thebluephantom

回答

2

的错误是在这里

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

由于xstring和你正在试图将其更改为Byte

你应该做的是

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

这并没有在这里失败

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

因为这是一个懒惰的评估,它不被执行,collect是一个动作。执行操作后,代码也会执行。

希望这有助于

+0

那么这是做什么的? – thebluephantom

+0

x.toCharArray()(0)即。 – thebluephantom

+0

如果您尝试使用ASCII码,它将转换为字符并转换为字节 –