【问题标题】:RDD collect() failureRDD 收集()失败
【发布时间】:2017-08-09 15:15:39
【问题描述】:

我觉得可能对其他人有益的问题。

如果我跑步

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

【问题讨论】:

  • 那是因为“map”是一个惰性转换,直到调用一个动作(“collect”)才会被调用。你的第一个例子没有失败,因为地图还没有被调用
  • 明白,但根本原因是?

标签: apache-spark collect


【解决方案1】:

错误在这里

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 是一个动作。执行操作后,代码也会执行。

希望对你有帮助

【讨论】:

  • 如果您尝试 ASCII 码,它会转换为 Char 并转换为 Byte
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2021-07-19
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多