如何构建RDD

129 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

如何构建RDD

构建RDD对象的方式主要有二种:

通过 parallelize('''') API 来构建RDD对象
通过加载外部数据集的方式构建:  textFile(....)

1 通过并行化方式来构建RDD

代码演示:

from pyspark import SparkContext,SparkConf
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"]="/export/server/spark"
os.environ["PYSPARK_PYTHON"]="/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"]="/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("构建RDD对象: 方式一演示")

    # 1) 构建sparkContext对象
    # local[*]:  * 表示当前环境中的cpu是几核的, * 就表示运行多少个线程
    conf = SparkConf().setMaster("local[*]").setAppName("init0")
    sc = SparkContext(conf=conf)


    #2) 通过 paralleleize 获取RDD对象
    # 通过初始化数据集方式来构建一个RDD对象
    rdd = sc.parallelize(["张三", "李四", "王五", "赵六", "田七"],6)
    #rdd = sc.parallelize(range(10))

    rdd2 = rdd.map(lambda name: (name, 1))

    #3) 打印这个RDD对象中数据
    # getNumPartitions()  是用于获取当前这个rdd有多少个分区数
    # glom() : 获取每一个分区的数据
    print(rdd2.getNumPartitions())
    print(rdd2.glom().collect())

说明:

1) 默认情况下, 分区数量取决于 Master参数设置, 以及linux服务器的cpu的数量设置
2) 支持手动设置数据的分区数量: 
	parallelize(初始数据集, 分区数量)
3) 如何获取分区数量:getNumPartitions()
4) 如果获取每一个分区下的数据: glom().collect()	

2 通过外部数据方式构建RDD

如何设置 pycharm的python脚本模板:

from pyspark import SparkContext, SparkConf
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("python core 模板")

代码实现:

from pyspark import SparkContext, SparkConf
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("演示构建RDD的第二种方式: 加载外部数据集")

    # 1) 创建 sparkContext对象
    conf = SparkConf().setMaster("local[*]").setAppName("init1")
    sc = SparkContext(conf=conf)

    #2) 构建RDD对象: 加载外部数据集
    # 请问 : 这里的写的路径对不对?  1  2
    # 注意: file:/// 本地路径 指的是 linux的本地路径 不是windows本地路径
    # 注意:
    #   在加载外部数据集, 如果数据是本地路径,文件有多少个, 自动划分多少个分区数, 如果加载HDFS, 有多少个block 对应就有多少个分区
    #   注意:  如果文件的分区数量小于了 local[*]的数量, 依然会以local[*]数量为标准
    rdd = sc.textFile("file:///export/data/workspace/_02_pyspark_core/data/")

    # 3) 打印 rdd数据
    print(rdd.getNumPartitions())
    print(rdd.glom().collect())