连载中:http://ihoge.cn/tags/pyspark/
title: 弹性式分布数据集RDD——Pyspark基础 (二)
date: 2018-04-15 17:59:21
comments: true
categories:
- Spark
tags:
- pyspark
RDD的内部运行方式
RDD不仅是一组不可变的JVM(Java虚拟机)对象的分布集,而且是Spark的核心,可以让任务执行高速运算。
RDD将跟踪(计入日记)应用于每个快的所有转换
,以加速计算速度,并在发生错误和部分数据丢失时提供回退(容错机制)。
RDD采用并行的运行方式,也就是每个转换操作并行执行,从而提高速度。
RDD有两种并行操作:
- 转换操作(返回指向新的RDD的指针)
- 动作操作(在运行计算后向驱动程序返回值)
数据集的转换通常是惰性
的,这也意味着任何转换操作仅在调用数据集上的操作时才执行。该延迟执行会产生风多的精细查询:针对性能进行优化查询。这种优化始于Spark的DAGScheduler——面向阶段的调度器。DAGScheduler负责Stage级的调度详见:Spark运行原理剖析
由于具有单独的RDD转换和动作,DAGScheduler可以在查询中执行优化。包括但不限于避免shuffle数据(最耗费资源的任务)
创建RDD
方式一: 用.parallelize(...)
集合(元素list或array)
data = sc.parallelize([('a',1),('b',2),('c',3),('d',5),('e',5)])
方式二: 读入外部文件
- 支持多文件系统中读取:如NTFS、FAT、HFS+(Mac OS Extended),或者如HDFS、S3、Cassandra这类的分布式文件系统,还有其他类文件系统。
- 指出多种数据格式:如文本、parquet、JSON、Hive tables(Hive表)以及使用JDBC驱动程序可读取的关系数据库中的数据。(注意:Spark可以自动处理压缩数据集)
��Tip1:读取的方式不同,持有对象表达方式也不同。从文件中读取的数据表示为MapPartitionsRDD
;使用集合方法的数据表示为ParallelCollectionRDD
��**Tip2:**RDD是无schema的数据结构(和DataFrame不同),所以我们几乎可以混用任何数据结构:tuple、dict、list和spark等都能支持。如果对数据集使用.collect()
方法,将把RDD对所有元素返回给驱动程序,驱动程序将其序列化成了一个列表。
data_from_file = sc.textFile("hdfs://master:9000/pydata/VS14MORT.txt.gz",4) # 这里表示4个分区
def extractInformation(row):
import re
import numpy as np
selected_indices = [
2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,
19,21,22,23,24,25,27,28,29,30,32,33,34,
36,37,38,39,40,41,42,43,44,45,46,47,48,
49,50,51,52,53,54,55,56,58,60,61,62,