sc.parallelize和sc.textFile有什么区别?

use*_*569 10 apache-spark rdd pyspark

我是Spark的新手.有人可以清楚我的怀疑:

让我们假设下面是我的代码:

a = sc.textFile(filename) 
b = a.filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()
Run Code Online (Sandbox Code Playgroud)

我希望下面是内部发生的事情:(如果我的理解错误,请更正)

(1)变量a将保存为包含预期txt文件内容的RDD变量

(2)驱动程序节点将工作分解为任务,每个任务包含有关它将对其进行操作的数据拆分的信息.现在,这些任务被分配给工作节点.

(3)当调用集合动作(即我们的例子中的collect())时,结果将从不同的节点返回到主节点,并保存为局部变量c.

现在我想了解下面代码的不同之处:

a = sc.textFile(filename).collect() 
b = sc.parallelize(a).filter(lambda x: len(x)>0 and x.split("\t").count("111")) 
c = b.collect() 
Run Code Online (Sandbox Code Playgroud)

有人可以澄清一下吗?

Jac*_*ski 15

(1)变量a将保存为包含预期txt文件内容的RDD变量

(突出我的)不是真的.该行刚介绍会发生什么后,你执行一个动作,即RDD变量并没有包含预期的txt文件的内容.

RDD描述了在调用操作时成为将读取其输入文件部分的任务的分区.

(2)驱动程序节点将工作分解为任务,每个任务包含有关它将对其进行操作的数据拆分的信息.现在,这些任务被分配给工作节点.

是的,但只有c=b.collect()在您的情况下调用某个操作时.

(3)当调用集合动作(即我们的例子中的collect())时,结果将从不同的节点返回到主节点,并保存为局部变量c.

是!这是内存最危险的操作,因为在集群中某处运行的所有Spark执行程序都开始将数据发送回驱动程序.

现在我想了解代码下面的差异

引用sc.textFile的文档:

文本文件(路径:字符串,minPartitions:INT = defaultMinPartitions):RDD [字符串]阅读来自HDFS,本地文件系统(所有节点上可用的),或任何Hadoop的支持的文件系统的URI的文本文件,并将其返回作为RDD字符串.

引用sc.parallelize的文档:

并行[T](SEQ ID NO:SEQ [T],numSlices:INT = defaultParallelism)(隐式为arg0:ClassTag [T]):RDD [T]分发的本地的Scala集合以形成RDD.

区别在于数据集 - 文件(for textFile)和本地集合(for parallelize).要么在幕后做同样的事情,也就是说它们都构建了如何访问将要使用转换和动作处理的数据的描述.

因此,主要区别在于数据来源.