SPARK收集尚未充分了解的副作用

时间:2018-06-24 19:56:06

标签: apache-spark

在不断寻求知识和他人的启发中,我注意到 下面的rdd3语句在没有collect的情况下有效,但在collect时则无效。我想知道为什么在阅读收藏时会感到困惑。这些示例是人为设计的,因此不必担心。

NP:

val rdd = sc.parallelize(List((" aaa", "x"), ("bbbb ", "y"), (" cc ", "z"), ("gggg  ", " a"), ("    ", "b")))
val rdd2 = rdd.map{ case (field1, field2) => ( field1.replaceAll(" ", ""), field1.trim, field1, field2) }.collect
val rdd3 = rdd2.map{ case (field1, field2, field3, field4) => (field1.replaceAll(" ", ""), if (field1.trim == "") " "  else field1 , field3, field4) }

问题:

val rdd3 = rdd2.map{ case (field1, field2, field3, field4) => (field1.replaceAll(" ", ""), if (field1.trim == "") " "  else field1 , field3, field4) }.collect

返回:

notebook:7: error: missing argument list for method collect in trait TraversableLike
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `collect _` or `collect(_)(_)` instead of `collect`.
val rdd3 = rdd2.map{ case (field1, field2, field3, field4) => (field1.replaceAll(" ", ""), if (field1.trim == "") " "  else field1 , field3, field4) }.collect

对于新手很难遵循。看到错误消息后,我该如何解决?

1 个答案:

答案 0 :(得分:1)

collect()方法将整个rdd / dataset的输出作为数组返回到驱动程序机器。

因此,在您的示例中rdd2将一个数组返回到驱动程序机器,因此您不能像RDD那样使用它。创建rdd2时,请删除collect方法,然后您的第三个collect语句应该起作用。