在不断寻求知识和他人的启发中,我注意到 下面的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
对于新手很难遵循。看到错误消息后,我该如何解决?
答案 0 :(得分:1)
collect()方法将整个rdd / dataset的输出作为数组返回到驱动程序机器。
因此,在您的示例中rdd2将一个数组返回到驱动程序机器,因此您不能像RDD那样使用它。创建rdd2时,请删除collect方法,然后您的第三个collect语句应该起作用。