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)
相关推荐
zhangxingchao7 分钟前
AI应用开发三:RAG技术与应用
前端·人工智能·后端
摘星小杨17 分钟前
如何在前端循环调取接口,实时查询数据
开发语言·前端·javascript
黑猫学长呀32 分钟前
存储宝典第2篇:盲封TT wafer是什么意思?
linux·嵌入式硬件·项目·芯片·ufs·晶圆·产测
Hilaku35 分钟前
从搜索排名到 AI 回答? 先聊一聊 AI 可见度工具 BuildSOM !
前端·javascript·程序员
zzmgc437 分钟前
纯静态 + Web Worker + 虚拟滚动:我是怎么让浏览器吃下 10MB JSON 不卡的
前端·架构
辰同学ovo38 分钟前
用 Chrome DevTools MCP 给 AI 写的页面做“质检“
前端·人工智能·chrome devtools
Strugglingler42 分钟前
【Linux 用户态操作 UART】
linux·uart
乌托邦1 小时前
uni-mini-ci:让 uniapp 小程序构建后自动预览和上传
前端·vue.js·uni-app
m0_702036531 小时前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
代码熬夜敲Q1 小时前
ENSP 网络工程实验
linux·运维·服务器