Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 应用RDD中每个元素的函数_Function_Apache Spark_Rdd - Fatal编程技术网

Function 应用RDD中每个元素的函数

Function 应用RDD中每个元素的函数,function,apache-spark,rdd,Function,Apache Spark,Rdd,我正在与spark rdd合作。我必须在rdd的每个元素上应用一个函数。当我调用rdd.map(x=>function(x))时,代码不会给出所需的输出,但当我调用rdd.collect().foreach(x=>function(x))时,代码工作正常。但是collect()的问题是,它将数据带到内存中,这使得大数据很难存储。如何在rdd的每个元素上调用此函数?这是因为rdd是不可变的,并且执行起来很慢 当您执行rdd.map(x=>function(x))时,您将使用应用的转换创建新的rdd

我正在与spark rdd合作。我必须在rdd的每个元素上应用一个函数。当我调用
rdd.map(x=>function(x))
时,代码不会给出所需的输出,但当我调用
rdd.collect().foreach(x=>function(x))
时,代码工作正常。但是
collect()
的问题是,它将数据带到内存中,这使得大数据很难存储。如何在rdd的每个元素上调用此函数?

这是因为rdd是不可变的,并且执行起来很慢

当您执行
rdd.map(x=>function(x))
时,您将使用应用的转换创建新的rdd。应用并不意味着已执行-RDD是转换和操作的衍生,当您键入
RDD.map
时,您将在RDD图中添加一个步骤来创建新的RDD。这就是为什么如果你这样做:

val rdd = // here reading
rdd.map (...)
rdd.collect()
collect()
的结果不会是
map
函数转换的源数据。旧的RDD没有改变

这是代码中的第一个错误

其次,当一些操作被触发时(收集、减少等),将执行转换,在本例中为map

请检查:

val mapped = rdd.map(x=>function(x))
// collect is an action, so above transformation map will be executed
mapped.collect().foreach (x => println(x)) // collect will trigger `map` also

它将在转换后打印内容。例如,如果执行
map.count()
,也将执行
map()
。在调用操作之前,不会执行任何转换,因为rdd是惰性的

请尝试rdd.mapPartitions(func)。它应用在每个分区上接受Iterable(例如:list)的函数。从技术上讲,您可以迭代每个分区中的元素,并在每个元素上应用所需的函数。

我知道您的
函数(x)
实际上是
println(x)
。您没有看到任何打印内容的原因是,该函数是在工作节点上执行的,因此它在工作节点上而不是在驱动程序上打印到标准输出。

您所说的“代码没有给出所需的输出”是什么意思?它会抛出错误吗?它是否给出了错误的结果?什么?在rdd.map(x=>function(x))之后调用了任何操作吗?colRDD5.map(x=>println(x))不会给出任何结果,而colRDD5.collect().foreach(x=>println(x))会打印每个element@RaviRanjan这是因为转换是延迟执行的,所以必须执行一些操作来执行转换,即count、collect,但我不能调用collext()由于内存问题。现在,本例中的函数在rdd的每个元素上运行后返回一个更新的列表。当我执行.map操作时,我无法访问该列表,而在另一种情况下它可以工作。
map
和其他转换只有在触发操作时才会执行,例如
collect
count,
reduce
。在RDD中更改值不可能比执行映射更容易,但在调用actionlazy时转换将被延迟执行,而不是不可变的,你不这么认为吗?@LostInOverflow你是什么意思?您不能更改RDD本身,但会创建新的RDD。而调用将惰性地进行。我错了吗?你是对的,但你描述的更多的是懒惰评估的结果。如果RDD是可变的,情况也会一样。