学做网站的软件,namecheap建站wordpress,国外服务器 网站进行经营性活动,WordPress导出单页目录 RDD 的内部工作机制
创建 RDDs
Schema
从文件中读取 弹性分布式数据集#xff08;RDDs#xff09;是一种分布式的不可变 JVM 对象集合#xff0c;它允许你非常快速地执行计算#xff0c;并且它们是 Apache Spark 的支柱。
顾名思义#xff0c;数据集是分布式的RDDs是一种分布式的不可变 JVM 对象集合它允许你非常快速地执行计算并且它们是 Apache Spark 的支柱。
顾名思义数据集是分布式的它根据某个键被分割成块并分布到执行器节点。这样做允许对这些数据集进行非常快速的计算。同样“理解 Spark”中提到的RDDs 跟踪记录应用于每个块的所有转换以加快计算速度并在出现问题并且那部分数据丢失时提供回退在这种情况下RDDs 可以重新计算数据。这种数据血统是防止数据丢失的另一道防线是数据复制的补充。
涵盖的主题有 - RDD 的内部工作机制 - 创建 RDDs - 全局作用域与局部作用域 - 转换Transformations - 动作Actions
RDD 的内部工作机制
RDDs 并行运行。这是在 Spark 中工作的最大优势每个转换都并行执行从而大幅提高速度。
对数据集的转换是懒执行的。这意味着任何转换只有在对数据集调用动作时才执行。这有助于 Spark 优化执行。例如考虑分析师通常会对数据集进行的以下非常常见的步骤 1. 统计某个列中不同值的出现次数。 2. 选择以 A 开头的那些值。 3. 将结果打印到屏幕上。
正如前面提到的步骤听起来很简单但如果只对以字母 A 开头的项目感兴趣那么统计所有其他项目的不重复值就没有意义。因此Spark 可以只统计以 A 开头的项目然后打印结果到屏幕上。
让我们用代码来分解这个例子。首先我们使用 .map(lambda v: (v, 1)) 方法命令 Spark 映射 A 的值然后选择以 A 开头的记录使用 .filter(lambda val: val.startswith(A)) 方法。 如果我们调用 .reduceByKey(operator.add) 方法它将减少数据集并添加在这个例子中计数每个键的出现次数。所有这些步骤都转换了数据集。
其次我们调用 .collect() 方法来执行步骤。这一步是我们数据集上的动作 - 它最终统计了数据集的不同元素。实际上动作可能会颠倒转换的顺序在映射之前先过滤数据从而在传递给 reducer 之前得到一个更小的数据集。
创建 RDDs
在 PySpark 中创建 RDD 有两种方式你可以使用 .parallelize(...) 并行化一个集合列表或某些元素的数组
data sc.parallelize([(Amber, 22), (Alfred, 23), (Skye,4), (Albert, 12), (Amber, 9)])
或者你可以引用一个文件或文件位于本地或外部某处
data_from_file sc.\ textFile(/Users/drabast/Documents/PySpark_Data/VS14MORT.txt.gz,4) sc.textFile(..., n) 中的最后一个参数指定了数据集被分成的分区数。
Spark 可以读取多种文件系统本地的如 NTFS、FAT 或 Mac OS Extended (HFS)或者分布式文件系统如 HDFS、S3、Cassandra 等。
支持多种数据格式文本、parquet、JSON、Hive 表以及使用 JDBC 驱动程序的数据从关系数据库中读取。请注意Spark 可以自动处理压缩数据集如我们前面例子中的 Gzipped 数据集。
根据数据的读取方式持有它的对象将略有不同。从文件中读取的数据表示为 MapPartitionsRDD 而不是 ParallelCollectionRDD当我们 .parallelize(...) 一个集合。
Schema
RDDs 是无模式的数据结构与 DataFrames 不同我们将在下一章讨论。因此当使用 RDDs 时Spark 允许像下面代码片段那样并行化数据集
data_heterogenous sc.parallelize([(Ferrari, fast),{Porsche: 100000},[Spain,visited, 4504]
]).collect()
所以我们可以混合使用几乎任何东西一个元组、一个字典或一个列表Spark 都不会抱怨。 一旦你对数据集调用了 .collect()也就是说执行一个动作将其带回驱动程序你可以像在 Python 中通常那样访问对象中的数据 data_heterogenous[1][Porsche] 这将产生以下结果 100000 .collect() 方法将 RDD 的所有元素作为列表序列化后返回到驱动程序。
从文件中读取
当你从文本文件中读取时文件中的每一行都会形成一个 RDD 的元素。 data_from_file.take(1) 命令将产生以下有些难以阅读的输出 为了使其更易于阅读让我们创建一个元素列表以便每行都表示为值的列表。