2017-08-09 35 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碼,它將轉換爲字符並轉換爲字節 –