spark01-创建RDD

  1. parallelize方法
java 复制代码
# 参数分别为List<T>,numSlices:参数用于指定将数据集切分成多少个分区
# Spark 推荐的分区数通常是物理核心数的 2-4 倍。
JavaRDD<Integer> rdd1 = sc.parallelize(Arrays.asList(1,2,3,4,5),1)
# 相对于parallelize通用性,偏重于Double类型,如果数据为double类型,性能较快
JavaDoubleRDD rdd2 = sc.parallelizeDoubles(Arrays.asList(1.0,2.0,3.0),1)
# 生成键值对类型的RDD
JavaPairRDD<String,Integer> rdd3 = sc.parallelizePairs(Arrays.asList(new Tuple2<String,Integer>("tom",12),new Tuple2<String,Integer>("jack",13)))
# 实体类,实体类需要实现序列化
JavaRDD<User> rdd4 = sc.parallelize(Arrays.asList(new User("tom",12),new User("jack",13)))

# 注意,Java只有生成PairRDD键值对类型才能使用reduceByKey等<K,V>方法
JavaRDD<Tuple2<String,Integer>> rdd5 = sc.parallelize(Arrays.asList(new Tuple2<String,Integer>("tom",12),new Tuple2<String,Integer>("jack",13)))
# rdd5不是键值对类型,通过mapToPair转为JavaPariRdd<String,Integer>,虽然二者很像,但是不相同
JavaPairRDD<String,Integer> rdd6 = rdd5.mapToPair(x->new Tuple2(x._1(),x._2()))
# PairRDD这种以对象作为主键的,需要针对对象重写equals和hashCode方法,并且需要实现序列化类
JavaPairRDD<User,Double> rdd7 = sc.parallelizePari(Arrays.asList(new Tuple2<User,Double>(new User("tom",12),85),new Tuple2<User,Double>(new User("tom",12),90)))

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return Objects.equals(id, employee.id) && Objects.equals(name, employee.name) && Objects.equals(age, employee.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }
python 复制代码
# python只提供了方法parallize(self,c,numSlices),python泛型机制
rdd1 = sc.parallelize([1,2,3,4,5],1)
rdd2 = sc.parallelize([1.0,2.0,3.0],2)
rdd3 = sc.parallelize([("tom",12),("jack",13)])
rdd4 = sc.parallelize([User("tom",12),User("jack",13)])
# rdd1虽然不是<K,V>型,但是依然提供了groupByKey方法,但是运行报错
# 注意,python也支持<K,V>其中K为实体,但是需要实现__eq__和__hash__方法
    def __eq__(self, other):
        if not isinstance(other,Employee):
            return False
        return self.name == other.name and self.age == other.age
    def __hash__(self):
        return hash((self.name, self.age))
  1. 通过读取文件创建RDD
java 复制代码
// 1. textFile(文件路径,最小分区数):如果实际分区小于最小分区数,按照最小分区数分区,否则落在最小分区数-理想分区数之间,如果想要强行修改分区,coalesce()是个不错方法,不涉及shuffle,但是容易造成数据倾斜
JavaRDD<String> rdd1 = sc.textFile(filePath,minPartitions)
// 2. wholeTextFiles-->返回(filename,content)
// 文件夹logs 01.txt
// 01.txt内容如下  
hello world
this is world
// 02.txt
this is world
hello world 
JavaPairRDD<String,String> rdd2 = sc.wholeTextFiles();
// 返回
01.txt hello world\nthis is world
02.txt this is world\nhello world
java 复制代码
# python版本
data = sc.textFile(path)
data1 = sc.wholeTextFiles(path)
相关推荐
共享家95272 小时前
轻量级日志模块实现:策略模式 + RAII 的工程化实践
linux·运维·服务器
老歌老听老掉牙2 小时前
Python 错误处理:从基础语法到工程级实践的完整指南
python·错误处理
水木流年追梦2 小时前
CodeTop Top 300 热门题目8-字符串解码
linux·运维·服务器·前端·算法·leetcode
杨云龙UP2 小时前
Docker MySQL 5.7 全库备份到异地服务器实践记录_20260427
linux·运维·服务器·数据库·mysql·docker·容器
敲上瘾2 小时前
LangChain 入门:大模型不会的,让 Tool 来做
python·langchain·aigc·tool
Coffeeee2 小时前
用了一段时间的AI了,忍不住想吐点槽,你的AI帮你提效了吗?
前端·人工智能·程序员
深蓝海拓2 小时前
Qt的HSL色彩系统
笔记·python·qt·学习
gmaajt2 小时前
html怎么转astro island模式_Astro Islands如何隔离HTML组件
jvm·数据库·python
剩下了什么2 小时前
dockerfile-知识概念介绍
linux·运维·服务器