groupBy 无法处理大型 RDD
groupBy cannot handle large RDDs
代码如下:
val words = sc.textFile("/Users/kaiyin/IdeaProjects/learnSpark/src/main/resources/eng_words.txt" )
words.take(1000000).foreach(println _)
words.take(150000).groupBy((x: String) => x.head).map {
case (c, iter) => (c, iter.toList.size)
}.foreach {
println _
}
eng_words.txt
是一个包含大约100万个英文单词的文本文件,每行一个。一旦 RDD 超过 150000,groupBy
将崩溃并出现此错误:
java.util.NoSuchElementException: next on empty iterator
at scala.collection.Iterator$$anon.next(Iterator.scala:39)
at scala.collection.Iterator$$anon.next(Iterator.scala:37)
at scala.collection.IndexedSeqLike$Elements.next(IndexedSeqLike.scala:63)
at scala.collection.IterableLike$class.head(IterableLike.scala:107)
at scala.collection.immutable.StringOps.scala$collection$IndexedSeqOptimized$$super$head(StringOps.scala:30)
at scala.collection.IndexedSeqOptimized$class.head(IndexedSeqOptimized.scala:126)
at scala.collection.immutable.StringOps.head(StringOps.scala:30)
at $anon$$anonfun$run.apply(<console>:23)
at $anon$$anonfun$run.apply(<console>:23)
at scala.collection.TraversableLike$$anonfun$groupBy.apply(TraversableLike.scala:332)
at scala.collection.TraversableLike$$anonfun$groupBy.apply(TraversableLike.scala:331)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.TraversableLike$class.groupBy(TraversableLike.scala:331)
at scala.collection.mutable.ArrayOps$ofRef.groupBy(ArrayOps.scala:186)
at $anon.run(<console>:23)
at Helper.HasRun$class.newRun(HasRun.scala:21)
at $anon.newRun(<console>:19)
... 55 elided
出了什么问题?
在这种特殊情况下,它很可能无法处理空字符串。不过不要 groupBy
,不要调用 toList
也不要盲目相信输入格式正确。
head
将在空行上失败并出现您看到的错误
groupBy
与 groupByKey
相同,要求每个键的所有记录都适合执行程序内存。
这里还有一个字数:
words
// Make sure that it won't fail on empty string with
// java.util.NoSuchElementException: next on empty iterator
.flatMap(_.headOption)
// Map to pairs and reduce to avoid excessive shuffling and limit memory usage
.map((_, 1))
.reduceByKey(_ + _)
代码如下:
val words = sc.textFile("/Users/kaiyin/IdeaProjects/learnSpark/src/main/resources/eng_words.txt" )
words.take(1000000).foreach(println _)
words.take(150000).groupBy((x: String) => x.head).map {
case (c, iter) => (c, iter.toList.size)
}.foreach {
println _
}
eng_words.txt
是一个包含大约100万个英文单词的文本文件,每行一个。一旦 RDD 超过 150000,groupBy
将崩溃并出现此错误:
java.util.NoSuchElementException: next on empty iterator
at scala.collection.Iterator$$anon.next(Iterator.scala:39)
at scala.collection.Iterator$$anon.next(Iterator.scala:37)
at scala.collection.IndexedSeqLike$Elements.next(IndexedSeqLike.scala:63)
at scala.collection.IterableLike$class.head(IterableLike.scala:107)
at scala.collection.immutable.StringOps.scala$collection$IndexedSeqOptimized$$super$head(StringOps.scala:30)
at scala.collection.IndexedSeqOptimized$class.head(IndexedSeqOptimized.scala:126)
at scala.collection.immutable.StringOps.head(StringOps.scala:30)
at $anon$$anonfun$run.apply(<console>:23)
at $anon$$anonfun$run.apply(<console>:23)
at scala.collection.TraversableLike$$anonfun$groupBy.apply(TraversableLike.scala:332)
at scala.collection.TraversableLike$$anonfun$groupBy.apply(TraversableLike.scala:331)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.TraversableLike$class.groupBy(TraversableLike.scala:331)
at scala.collection.mutable.ArrayOps$ofRef.groupBy(ArrayOps.scala:186)
at $anon.run(<console>:23)
at Helper.HasRun$class.newRun(HasRun.scala:21)
at $anon.newRun(<console>:19)
... 55 elided
出了什么问题?
在这种特殊情况下,它很可能无法处理空字符串。不过不要 groupBy
,不要调用 toList
也不要盲目相信输入格式正确。
head
将在空行上失败并出现您看到的错误groupBy
与groupByKey
相同,要求每个键的所有记录都适合执行程序内存。
这里还有一个字数:
words
// Make sure that it won't fail on empty string with
// java.util.NoSuchElementException: next on empty iterator
.flatMap(_.headOption)
// Map to pairs and reduce to avoid excessive shuffling and limit memory usage
.map((_, 1))
.reduceByKey(_ + _)